Commit f95cb58c authored by daniel's avatar daniel

fix(urlLink): 新增小程序短链接

parent aae107f7
package com.dlbridge.jadp.plugins.cmpt.service;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONUtil;
import com.dlbridge.jadp.plugins.cmpt.bean.Partner;
import com.dlbridge.jadp.plugins.cmpt.bean.UrlLinkParam;
import com.dlbridge.jadp.plugins.cmpt.bean.UrlSchemeParam;
import com.dlbridge.jadp.plugins.cmpt.utils.HttpUtil;
import com.dlbridge.jadp.plugins.cmpt.utils.json.JsonUtil;
import com.fasterxml.jackson.core.type.TypeReference;
import com.neusoft.www.utils.web.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Service
@Slf4j
public class WechatMiniService {
@Resource
private ValueOperations valueOperations;
@Resource
PartnerService partnerService;
@Resource
private CmptService cmptService;
/**
* 获取url link
*/
public final static String GENERATE_URL_LINK = "https://api.weixin.qq.com/wxa/generate_urllink";
/**
* 获取 SCHEME
*/
public final static String GENERATE_SCHEME = "https://api.weixin.qq.com/wxa/generatescheme";
/**
* 重新获取小程序access_token
* @param partnerId 小程序组委会ID
* @return access_token
*/
public String getMicroAccessToken(String partnerId){
String accessToken = (String) valueOperations.get("micro_gk:access_token_" + partnerId);
log.info("===== redis access_token:" + accessToken);
if (StringUtils.isEmpty(accessToken)) {
Partner partner = partnerService.getPartnerById(partnerId);
String aokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + partner.getAppId() + "&secret=" + partner.getAppSecret();
String json = HttpUtil.doGet(aokenUrl, null);
log.info("URL:" + aokenUrl + ", 返回结果:" + json);
Map<String, Object> resultMap = JsonUtil.fromJson(json, new TypeReference<Map<String, Object>>() {
});
accessToken = resultMap.get("access_token").toString();
String expiresIn = resultMap.get("expires_in").toString();
valueOperations.set("micro_gk:access_token_" + partnerId, accessToken, Long.parseLong(expiresIn), TimeUnit.SECONDS);
}
return accessToken;
}
/**
* 重置小程序access_token
* @param partnerId 小程序组委会ID
* @return access_token
*/
public String resetMicroAccessToken(String partnerId){
String accessToken = "";
Partner partner = partnerService.getPartnerById(partnerId);
String aokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + partner.getAppId() + "&secret=" + partner.getAppSecret();
String json = HttpUtil.doGet(aokenUrl, null);
log.info("URL:" + aokenUrl + ", 重新获取小程序token返回结果:" + json);
Map<String, Object> resultMap = JsonUtil.fromJson(json, new TypeReference<Map<String, Object>>() {
});
accessToken = resultMap.get("access_token").toString();
String expiresIn = resultMap.get("expires_in").toString();
valueOperations.set("micro_gk:access_token_" + partnerId, accessToken, Long.parseLong(expiresIn), TimeUnit.SECONDS);
return accessToken;
}
/**
* @param urlLinkParam 参数
* @return string
* @link <a href="https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/url-link/generateUrlLink.html">...</a>
*/
public Result<String> generateUrlLink(UrlLinkParam urlLinkParam) {
String partnerId = cmptService.getPartnerId(urlLinkParam.getCmptId());
try {
// 获取小程序 access_token
String accessToken = getMicroAccessToken(partnerId);
// Creating the parameters
cn.hutool.json.JSONObject params = new cn.hutool.json.JSONObject();
params.set("path", urlLinkParam.getPage());
params.set("query", urlLinkParam.getQuery());
params.set("env_version", urlLinkParam.getEnvVersion());
// 构造请求参数
String jsonParams = JsonUtil.toJson(params);
// 发起请求
// String response = HttpUtil.post(GENERATE_URL_LINK, accessToken, "application/json", jsonParams);
HttpRequest request = HttpRequest.post(GENERATE_URL_LINK + "?access_token=" + accessToken)
.header("Content-Type", "application/json")
.body(jsonParams);
String response = request.execute().body();
// 解析返回结果
cn.hutool.json.JSONObject result = JSONUtil.parseObj(response);
if (result.containsKey("url_link")) {
return Result.success().setContent(result.getStr("url_link"));
} else {
log.error("Failed to generate UrlLink: {}", result);
return null;
}
} catch (Exception e) {
log.error("Error generating UrlLink: {}", e.getMessage(), e);
// 如果失败,重置 access_token
resetMicroAccessToken(partnerId);
return null;
}
}
/**
* @param urlSchemeParam 参数
* @return string
* @link <a href="https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/url-link/generateUrlLink.html">...</a>
*/
public Result<String> generateUrlScheme(UrlSchemeParam urlSchemeParam) {
String partnerId = cmptService.getPartnerId(urlSchemeParam.getCmptId());
try {
// 获取小程序 access_token
String accessToken = getMicroAccessToken(partnerId);
// 构造请求参数
cn.hutool.json.JSONObject params = new cn.hutool.json.JSONObject();
cn.hutool.json.JSONObject jump_wxa = new cn.hutool.json.JSONObject();
jump_wxa.set("path", urlSchemeParam.getPage());
jump_wxa.set("query", urlSchemeParam.getQuery());
jump_wxa.set("env_version", urlSchemeParam.getEnvVersion());
params.set("jump_wxa", jump_wxa);
// 使用 Hutool 的 toString() 来确保请求体是正确的 JSON 格式
String jsonParams = params.toString();
// 输出调试信息,确认请求的 JSON 格式
System.out.println("Sending JSON: " + jsonParams);
// 发起请求
HttpRequest request = HttpRequest.post(GENERATE_SCHEME + "?access_token=" + accessToken)
.header("Content-Type", "application/json")
.body(jsonParams);
String response = request.execute().body();
// 解析返回结果
cn.hutool.json.JSONObject result = JSONUtil.parseObj(response);
if (result.containsKey("openlink")) {
return Result.success().setContent(result.getStr("openlink"));
} else {
log.error("Failed to generate UrlSchema: {}", result);
return null;
}
} catch (Exception e) {
log.error("Error generating UrlSchema: {}", e.getMessage(), e);
// 如果失败,重置 access_token
resetMicroAccessToken(partnerId);
return null;
}
}
}
...@@ -4,6 +4,9 @@ import com.alibaba.fastjson.JSON; ...@@ -4,6 +4,9 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.dlbridge.jadp.plugins.cmpt.bean.Partner; import com.dlbridge.jadp.plugins.cmpt.bean.Partner;
import com.dlbridge.jadp.plugins.cmpt.dao.mapper.CmptMapper; import com.dlbridge.jadp.plugins.cmpt.dao.mapper.CmptMapper;
import com.dlbridge.jadp.plugins.cmpt.utils.HttpUtil;
import com.dlbridge.jadp.plugins.cmpt.utils.json.JsonUtil;
import com.fasterxml.jackson.core.type.TypeReference;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.apache.http.HttpEntity; import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.CloseableHttpResponse;
...@@ -14,7 +17,9 @@ import org.apache.http.impl.client.HttpClients; ...@@ -14,7 +17,9 @@ import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder; import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.TrustStrategy; import org.apache.http.ssl.TrustStrategy;
import org.apache.http.util.EntityUtils; import org.apache.http.util.EntityUtils;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLContext;
...@@ -23,6 +28,8 @@ import java.security.KeyStoreException; ...@@ -23,6 +28,8 @@ import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Service @Service
@Log4j2 @Log4j2
...@@ -31,6 +38,8 @@ public class WeixinInfoService { ...@@ -31,6 +38,8 @@ public class WeixinInfoService {
@Resource @Resource
CmptMapper cmptMapper; CmptMapper cmptMapper;
public JSONObject getOpenIdAndSessionKey(String code, String partnerId) { public JSONObject getOpenIdAndSessionKey(String code, String partnerId) {
try { try {
Partner parnter= cmptMapper.getParnterByParnterId(partnerId); Partner parnter= cmptMapper.getParnterByParnterId(partnerId);
......
package com.dlbridge.jadp.plugins.cmpt.web; package com.dlbridge.jadp.plugins.cmpt.web;
import cn.hutool.json.JSONUtil;
import com.dlbridge.jadp.plugins.cmpt.bean.Partner;
import com.dlbridge.jadp.plugins.cmpt.bean.UrlLinkParam;
import com.dlbridge.jadp.plugins.cmpt.bean.UrlSchemeParam;
import com.dlbridge.jadp.plugins.cmpt.dao.model.Cmpt; import com.dlbridge.jadp.plugins.cmpt.dao.model.Cmpt;
import com.dlbridge.jadp.plugins.cmpt.service.CmptService; import com.dlbridge.jadp.plugins.cmpt.service.CmptService;
import com.dlbridge.jadp.plugins.cmpt.service.PartnerService; import com.dlbridge.jadp.plugins.cmpt.service.WechatMiniService;
import com.dlbridge.jadp.plugins.cmpt.utils.HttpUtil;
import com.dlbridge.jadp.plugins.cmpt.utils.json.JsonUtil;
import com.fasterxml.jackson.core.type.TypeReference;
import com.neusoft.www.utils.web.Result;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
import org.json.JSONObject; import org.json.JSONObject;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import springfox.documentation.annotations.ApiIgnore; import springfox.documentation.annotations.ApiIgnore;
...@@ -32,8 +25,6 @@ import java.io.IOException; ...@@ -32,8 +25,6 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.URL; import java.net.URL;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Controller @Controller
@RequestMapping(value = "/img") @RequestMapping(value = "/img")
...@@ -47,20 +38,17 @@ public class ResourcesController { ...@@ -47,20 +38,17 @@ public class ResourcesController {
@Resource @Resource
CmptService cmptService; CmptService cmptService;
@Resource
PartnerService partnerService;
@Resource @Resource
private ValueOperations valueOperations; private WechatMiniService wechatMiniService;
/**
* 获取url link
*/
public final static String GENERATE_URL_LINK = "https://api.weixin.qq.com/wxa/generate_urllink";
/**
* 获取 SCHEME
*/
public final static String GENERATE_SCHEME = "https://api.weixin.qq.com/wxa/generatescheme";
/** /**
* 小程序码生成 * 小程序码生成
...@@ -78,7 +66,7 @@ public class ResourcesController { ...@@ -78,7 +66,7 @@ public class ResourcesController {
String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token="; String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=";
try { try {
// 重新获取小程序access_token // 重新获取小程序access_token
String accessToken = getMicroAccessToken(partnerId); String accessToken = wechatMiniService.getMicroAccessToken(partnerId);
url += accessToken; url += accessToken;
ResponseEntity<org.springframework.core.io.Resource> resourceResponseEntity = restTemplate.postForEntity(url, obj.toString(), org.springframework.core.io.Resource.class); ResponseEntity<org.springframework.core.io.Resource> resourceResponseEntity = restTemplate.postForEntity(url, obj.toString(), org.springframework.core.io.Resource.class);
...@@ -95,7 +83,7 @@ public class ResourcesController { ...@@ -95,7 +83,7 @@ public class ResourcesController {
} }
} catch (Exception e) { } catch (Exception e) {
log.info("=====获取小程序二维码异常: "+e.getMessage()); log.info("=====获取小程序二维码异常: "+e.getMessage());
resetMicroAccessToken(partnerId); wechatMiniService.resetMicroAccessToken(partnerId);
} }
} }
...@@ -114,7 +102,7 @@ public class ResourcesController { ...@@ -114,7 +102,7 @@ public class ResourcesController {
String partnerId = cmptService.getPartnerId(cmptid); String partnerId = cmptService.getPartnerId(cmptid);
try { try {
// 重新获取小程序access_token // 重新获取小程序access_token
String accessToken = getMicroAccessToken(partnerId); String accessToken = wechatMiniService.getMicroAccessToken(partnerId);
ResponseEntity<org.springframework.core.io.Resource> resourceResponseEntity = restTemplate.postForEntity( ResponseEntity<org.springframework.core.io.Resource> resourceResponseEntity = restTemplate.postForEntity(
"https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken , obj.toString(), org.springframework.core.io.Resource.class); "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken , obj.toString(), org.springframework.core.io.Resource.class);
Cmpt cmpt = cmptService.queryCmptBycmptId(cmptid); Cmpt cmpt = cmptService.queryCmptBycmptId(cmptid);
...@@ -128,7 +116,7 @@ public class ResourcesController { ...@@ -128,7 +116,7 @@ public class ResourcesController {
} }
} catch (Exception e) { } catch (Exception e) {
log.info("=====下载小程序二维码异常: "+e.getMessage()); log.info("=====下载小程序二维码异常: "+e.getMessage());
resetMicroAccessToken(partnerId); wechatMiniService.resetMicroAccessToken(partnerId);
} }
} }
...@@ -237,117 +225,8 @@ public class ResourcesController { ...@@ -237,117 +225,8 @@ public class ResourcesController {
out.close(); out.close();
} }
/**
* 重新获取小程序access_token
* @param partnerId 小程序组委会ID
* @return access_token
*/
private String getMicroAccessToken(String partnerId){
String accessToken = (String) valueOperations.get("micro_gk:access_token_" + partnerId);
log.info("===== redis access_token:" + accessToken);
if (StringUtils.isEmpty(accessToken)) {
Partner partner = partnerService.getPartnerById(partnerId);
String aokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + partner.getAppId() + "&secret=" + partner.getAppSecret();
String json = HttpUtil.doGet(aokenUrl, null);
log.info("URL:" + aokenUrl + ", 返回结果:" + json);
Map<String, Object> resultMap = JsonUtil.fromJson(json, new TypeReference<Map<String, Object>>() {
});
accessToken = resultMap.get("access_token").toString();
String expiresIn = resultMap.get("expires_in").toString();
valueOperations.set("micro_gk:access_token_" + partnerId, accessToken, Long.parseLong(expiresIn), TimeUnit.SECONDS);
}
return accessToken;
}
private String resetMicroAccessToken(String partnerId){
String accessToken = "";
Partner partner = partnerService.getPartnerById(partnerId);
String aokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + partner.getAppId() + "&secret=" + partner.getAppSecret();
String json = HttpUtil.doGet(aokenUrl, null);
log.info("URL:" + aokenUrl + ", 重新获取小程序token返回结果:" + json);
Map<String, Object> resultMap = JsonUtil.fromJson(json, new TypeReference<Map<String, Object>>() {
});
accessToken = resultMap.get("access_token").toString();
String expiresIn = resultMap.get("expires_in").toString();
valueOperations.set("micro_gk:access_token_" + partnerId, accessToken, Long.parseLong(expiresIn), TimeUnit.SECONDS);
return accessToken;
}
// 生成小程序urlLink
/**
* @param urlLinkParam 参数
* @return string
* @link <a href="https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/url-link/generateUrlLink.html">...</a>
*/
@PostMapping("/wxUrlLink")
public Result<String> generateUrlLink(@RequestBody UrlLinkParam urlLinkParam) {
String partnerId = cmptService.getPartnerId(urlLinkParam.getCmptId());
try {
// 获取小程序 access_token
String accessToken = getMicroAccessToken(partnerId);
// Creating the parameters
cn.hutool.json.JSONObject params = new cn.hutool.json.JSONObject();
params.set("path", urlLinkParam.getPage());
params.set("query", urlLinkParam.getQuery());
params.set("env_version", urlLinkParam.getEnvVersion());
// 构造请求参数
String jsonParams = JsonUtil.toJson(params);
// 发起请求
String response = HttpUtil.post(GENERATE_URL_LINK, accessToken, "application/json", jsonParams);
// 解析返回结果
cn.hutool.json.JSONObject result = JSONUtil.parseObj(response);
if (result.containsKey("url_link")) {
return Result.success().setContent(result.getStr("url_link"));
} else {
log.error("Failed to generate UrlLink: {}", result);
return null;
}
} catch (Exception e) {
log.error("Error generating UrlLink: {}", e.getMessage(), e);
// 如果失败,重置 access_token
resetMicroAccessToken(partnerId);
return null;
}
}
/**
* @param urlSchemeParam 参数
* @return string
* @link <a href="https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/url-link/generateUrlLink.html">...</a>
*/
@PostMapping("/wxUrlSchema")
public Result<String> generateUrlScheme(@RequestBody UrlSchemeParam urlSchemeParam) {
String partnerId = cmptService.getPartnerId(urlSchemeParam.getCmptId());
try {
// 获取小程序 access_token
String accessToken = getMicroAccessToken(partnerId);
// 构造请求参数
cn.hutool.json.JSONObject params = new cn.hutool.json.JSONObject();
cn.hutool.json.JSONObject jump_wxa = new cn.hutool.json.JSONObject();
jump_wxa.set("path", urlSchemeParam.getPage());
jump_wxa.set("query", urlSchemeParam.getQuery());
jump_wxa.set("env_version", urlSchemeParam.getEnvVersion());
params.set("jump_wxa", jump_wxa);
// 使用 Hutool 的 toString() 来确保请求体是正确的 JSON 格式
String jsonParams = params.toString();
// 输出调试信息,确认请求的 JSON 格式
System.out.println("Sending JSON: " + jsonParams);
// 发起请求
String response = HttpUtil.post(GENERATE_SCHEME, accessToken, "application/json", jsonParams);
// 解析返回结果
cn.hutool.json.JSONObject result = JSONUtil.parseObj(response);
if (result.containsKey("openlink")) {
return Result.success().setContent(result.getStr("openlink"));
} else {
log.error("Failed to generate UrlSchema: {}", result);
return null;
}
} catch (Exception e) {
log.error("Error generating UrlSchema: {}", e.getMessage(), e);
// 如果失败,重置 access_token
resetMicroAccessToken(partnerId);
return null;
}
}
} }
package com.dlbridge.jadp.plugins.cmpt.web;
import com.dlbridge.jadp.plugins.cmpt.bean.UrlLinkParam;
import com.dlbridge.jadp.plugins.cmpt.bean.UrlSchemeParam;
import com.dlbridge.jadp.plugins.cmpt.service.WechatMiniService;
import com.neusoft.www.utils.web.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@Controller
@RestController
@RequestMapping(value = "/gk/wechatMini")
@Api(value = "微信小程序接口", tags = "微信小程序接口")
@Log4j2
public class WechatMiniController {
@Resource
private WechatMiniService wechatMiniService;
/**
* @param urlLinkParam 参数
* @return string
* @link <a href="https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/url-link/generateUrlLink.html">...</a>
*/
@PostMapping("/wxUrlLink")
@ApiOperation(value = "生成小程序urlLink",notes = "生成小程序urlLink")
public Result<String> generateUrlLink(@RequestBody UrlLinkParam urlLinkParam) {
return wechatMiniService.generateUrlLink(urlLinkParam);
}
/**
* @param urlSchemeParam 参数
* @return string
* @link <a href="https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/url-link/generateUrlLink.html">...</a>
*/
@PostMapping("/wxUrlSchema")
@ApiOperation(value = "生成小程序urlScheme",notes = "生成小程序urlScheme")
public Result<String> generateUrlScheme(@RequestBody UrlSchemeParam urlSchemeParam) {
return wechatMiniService.generateUrlScheme(urlSchemeParam);
}
}
...@@ -337,6 +337,13 @@ ...@@ -337,6 +337,13 @@
value="${cmpt.isShowTab ? 1 : 0}" /> value="${cmpt.isShowTab ? 1 : 0}" />
</div> </div>
</div> </div>
<div class="card-header d-flex align-items-center">
<h2 class="h3">短链接:</h2>
<h3 id="shortLink"></h3>
</div>
<div class="card-header d-flex align-items-center">
适用于短信、邮件、网页、微信内等拉起小程序的业务场景
</div>
</div> </div>
</div> </div>
</div> </div>
......
...@@ -76,6 +76,8 @@ $(function () { ...@@ -76,6 +76,8 @@ $(function () {
// 小程序路径 // 小程序路径
const path = "pages/race/raceHome?raceId=" + getCmptId() const path = "pages/race/raceHome?raceId=" + getCmptId()
$('.path').text("小程序路径:" + path) $('.path').text("小程序路径:" + path)
// 获取短链接
getShortLink()
}) })
...@@ -209,3 +211,18 @@ var saveFile = function (data, filename) { ...@@ -209,3 +211,18 @@ var saveFile = function (data, filename) {
event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
save_link.dispatchEvent(event); save_link.dispatchEvent(event);
}; };
// 获取短链接
function getShortLink() {
let data = { 'cmptId': getCmptId(), page: 'pages/race/raceHome', query: 'raceId=' + getCmptId() }
fetch("/gk/wechatMini/wxUrlLink", {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(data)
}).then(res => res.json()).then(data => {
if (data.content) {
$('#shortLink').text(data.content)
}
})
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment