私は、開発全体のプロセスについて非常に少数のレコードを共有するマイクロチャネル上Vueの情報、指導の多くの欠点。
ドキュメントのマイクロチャンネル公衆数が投稿されていません。
マイクロチャネルJS-SDKをダウンロード
NPMは、インストールを推奨しましたnpm install jweixin-module --save
共有ページ参照
var wx = require('jweixin-module')
署名インターフェース(Javaのばねブート開発)の後端
コントローラ
@RequestMapping(value = "/wechat/getSignature",method = RequestMethod.POST)
public Result getSignature(HttpServletRequest request, HttpServletResponse response,
@RequestBody Signature signature,
@RequestParam(defaultValue = "") String callback) throws Exception {
signature = wechatUtilsService.getSignature(signature);
return ResultUtil.success(signature);
}
サービス
private String jsApiTicket = "";
private Date expiredTime;
public Signature getSignature(Signature signature) throws Exception {
//获取access_token
Map<String,String> accessToken = wechatTokenService.getAccessToken();
String access_token = accessToken.get("access_token"); //access_token 自己获取一下
if (!StringUtils.isEmpty(access_token)){
dealJsApiTicket( access_token);
if (!StringUtils.isEmpty(jsApiTicket)){
String timeStamp = SignatureUtil.getTimeStamp();
String nonce = SignatureUtil.getRandomStr();
String url = signature.getUrl();
String sign = SignatureUtil.createSignature(timeStamp, nonce, jsApiTicket, url);
signature.setNoncestr(nonce);
signature.setTimestamp(timeStamp);
signature.setSignature(sign);
signature.setTicket(jsApiTicket);
}
}
return signature;
}
private void dealJsApiTicket( String accessToken){
if (StringUtils.isEmpty(jsApiTicket) || expiredTime.before(new Date())){
jsApiTicket = getJsApiTicket(accessToken);
if (!StringUtils.isEmpty(jsApiTicket)){
long currentTime = System.currentTimeMillis();
currentTime += 120*60*1000;
expiredTime = new Date(currentTime);
}
}
}
private String getJsApiTicket(String accessToken){
JSONObject jsapiTicket = WXHttpUtil.HttpRequest4Blocking("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken+"&type=jsapi", "GET");
return jsapiTicket.getString("ticket");
}
その他のカテゴリー:
public class SignatureUtil {
/**
* 创建SHA1签名
* @param params
* @return SHA1签名
*/
public static String createSignature(SortedMap<String, String> params) {
System.out.println("string : " + sortParams(params));
return sha1Encrypt(sortParams(params));
}
/**
* 创建SHA1签名
* @param timeStamp
* @param nonce
* @return SHA1签名
*/
public static String createSignature(String timeStamp, String nonce, String jsapi_ticket, String url) {
SortedMap<String, String> signParams = new TreeMap<String, String>();
signParams.put("jsapi_ticket", jsapi_ticket);
signParams.put("noncestr", nonce);
signParams.put("timestamp", timeStamp);
signParams.put("url", url);
return createSignature(signParams);
}
/**
* 使用SHA1算法对字符串进行加密
* @param str
* @return
*/
public static String sha1Encrypt(String str) {
if (str == null || str.length() == 0) {
return null;
}
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f' };
try {
MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
mdTemp.update(str.getBytes("UTF-8"));
byte[] md = mdTemp.digest();
int j = md.length;
char buf[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
buf[k++] = hexDigits[byte0 & 0xf];
}
return new String(buf);
} catch (Exception e) {
return null;
}
}
/**
* 生成时间戳
* @return
*/
public static String getTimeStamp() {
return String.valueOf(System.currentTimeMillis() / 1000);
}
/**
* 生成6位随机字符串
* @return
*/
public static String getRandomStr() {
int length = 6;
String base = "abcdefghijklmnopqrstuvwxyz0123456789";
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
return sb.toString();
}
/**
* 根据参数名称对参数进行字典排序
* @param params
* @return
*/
private static String sortParams(SortedMap<String, String> params) {
StringBuffer sb = new StringBuffer();
Set<Entry<String, String>> es = params.entrySet();
Iterator<Entry<String, String>> it = es.iterator();
while (it.hasNext()) {
Entry<String, String> entry = it.next();
String k = entry.getKey();
String v = entry.getValue();
sb.append(k + "=" + v + "&");
}
return sb.substring(0, sb.lastIndexOf("&"));
}
public static void main(String[] args) throws Exception {
String jsapi = "c4db7f5867a6290378cf24429f2803da0516a788";
String url = "https://qasp.yhcrm.cn/chat/sspf/index.html";
String timeStamp = getTimeStamp();
String nonce = getRandomStr();
String sign = createSignature(timeStamp, nonce, jsapi, url);
System.out.println("timeStamp:"+timeStamp);
System.out.println("nonce:"+nonce);
System.out.println("signature:" + sign);
}
}
public class WXHttpUtil {
private WXHttpUtil() {
// TODO Auto-generated constructor stub
}
/**
* HttpRequest 请求结果回调接口
*/
public static interface HttpResponse {
/**
* 请求成功
*
* @param object
* JSONObject
*/
void onOk(JSONObject object);
/**
* 请求失败
*
* @param cause
* 异常
*/
void onError(Throwable cause);
}
/**
* 发起网络请求-异步式
*
* @param requestUrl
* 请求地址
* @param requestMethod
* 请求方式(GET、POST)
* @param resp
* 请求结果回调
*/
public static void HttpRequest(String requestUrl, String requestMethod,
HttpResponse resp) {
HttpRequest(requestUrl, requestMethod, null, resp);
}
/**
* 发起网络请求-异步式
*
* @param requestUrl
* 请求地址
* @param requestMethod
* 请求方式(GET、POST)
* @param outputStr
* 提交的数据
* @param resp
* 请求结果回调
*/
public static void HttpRequest(String requestUrl, String requestMethod,
String outputStr, HttpResponse resp) {
try {
// buffer 缓冲流
StringBuffer buffer = new StringBuffer();
// 建立连接
URL url = new URL(requestUrl);
// 获取 HttpURLConnection对象
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
// 设置输出流
connection.setDoOutput(true);
// 设置输入流
connection.setDoInput(true);
// 是否使用缓存
connection.setUseCaches(false);
// 请求方式
connection.setRequestMethod(requestMethod);
// 流不为空
if (outputStr != null) {
// 获取流
OutputStream out = connection.getOutputStream();
// 写数据流 UTF-8 编码
out.write(outputStr.getBytes("UTF-8"));
// 关闭
out.close();
}
// 流处理
InputStream input = connection.getInputStream();
// 读取流 UTF-8 编码
InputStreamReader inputReader = new InputStreamReader(input,
"UTF-8");
// 缓冲流 buffer
BufferedReader reader = new BufferedReader(inputReader);
// 定义 String
String line;
// 循环读取每一行,知道数据没有了,意思是读取完了
while ((line = reader.readLine()) != null) {
// 添加到StringBuffer字符流里面
buffer.append(line);
}
// 关闭连接、释放资源
reader.close();
// 关闭
inputReader.close();
// 关闭
input.close();
// 释放、待gc
input = null;
// 关闭连接
connection.disconnect();
if (resp != null)
resp.onOk(JSONObject.parseObject(buffer.toString()));
} catch (Exception e) {
if (resp != null)
resp.onError(e.getCause());
}
}
/**
* 发起网络请求-阻塞式
*
* @param requestUrl
* 请求地址
* @param requestMethod
* 请求方式(GET、POST)
* @return JSONObject
*/
public static JSONObject HttpRequest4Blocking(String requestUrl,
String requestMethod) {
return HttpRequest4Blocking(requestUrl, requestMethod, null);
}
/**
* 发起网络请求-阻塞式
*
* @param requestUrl
* 请求地址
* @param requestMethod
* 请求方式(GET、POST)
* @param outputStr
* 提交的数据
* @return JSONObject
*/
public static JSONObject HttpRequest4Blocking(String requestUrl,
String requestMethod, String outputStr) {
try {
// buffer 缓冲流
StringBuffer buffer = new StringBuffer();
// 建立连接
URL url = new URL(requestUrl);
// 获取 HttpURLConnection对象
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
// 设置输出流
connection.setDoOutput(true);
// 设置输入流
connection.setDoInput(true);
// 是否使用缓存
connection.setUseCaches(false);
// 请求方式
connection.setRequestMethod(requestMethod);
// 流不为空
if (outputStr != null) {
// 获取流
OutputStream out = connection.getOutputStream();
// 写数据流 UTF-8 编码
out.write(outputStr.getBytes("UTF-8"));
// 关闭
out.close();
}
// 流处理
InputStream input = connection.getInputStream();
// 读取流 UTF-8 编码
InputStreamReader inputReader = new InputStreamReader(input,
"UTF-8");
// 缓冲流 buffer
BufferedReader reader = new BufferedReader(inputReader);
// 定义 String
String line;
// 循环读取每一行,知道数据没有了,意思是读取完了
while ((line = reader.readLine()) != null) {
// 添加到StringBuffer字符流里面
buffer.append(line);
}
// 关闭连接、释放资源
reader.close();
// 关闭
inputReader.close();
// 关闭
input.close();
// 释放、待gc
input = null;
// 关闭连接
connection.disconnect();
return JSONObject.parseObject(buffer.toString());
} catch (Exception e) {
System.out.println(e.getCause().toString());
}
return null;
}
/**
* 根据内容类型判断文件扩展名
*
* @param contentType
* 内容类型
* @return 文件扩展名
*/
public static String getFileEndWitsh(String contentType) {
String fileEndWitsh = "";
if ("image/jpeg".equals(contentType))
fileEndWitsh = ".jpg";
else if ("image/png".equals(contentType))
fileEndWitsh = ".png";
else if ("audio/mpeg".equals(contentType))
fileEndWitsh = ".mp3";
else if ("audio/amr".equals(contentType))
fileEndWitsh = ".amr";
else if ("video/mp4".equals(contentType))
fileEndWitsh = ".mp4";
else if ("video/mpeg4".equals(contentType))
fileEndWitsh = ".mp4";
else if ("voice/amr".equals(contentType))
fileEndWitsh = ".amr";
else if (contentType.startsWith("application")) {
fileEndWitsh = contentType.substring(
contentType.lastIndexOf("/") + 1,
(contentType.contains(";") ? contentType.lastIndexOf(";")
: contentType.length())).trim();
if (!fileEndWitsh.equals("json"))
fileEndWitsh = "." + fileEndWitsh;
}
return fileEndWitsh;
}
/**
* 将url进行urlencode编码
*
* @param str
* 被编码的url
* @return 编码后的url
*/
public static String URLEncoder(String str) {
String result = str;
try {
result = java.net.URLEncoder.encode(result, "UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
@Data
public class Signature implements Serializable {
private String noncestr;
private String signature;
private String timestamp;
private String ticket;
private String url;
}
バックエンドのコードそんなに。
リクエストインターフェイス
uni.request({
url:"/wechat/getSignature",
method:"POST",
data:{
url: window.location.href
},
success: (res) => {
var signature = res.data.data
wx.config({
beta: true,
debug: false,
appId: "appid",
timestamp: signature.timestamp,
nonceStr: signature.noncestr,
signature: signature.signature,
jsApiList: ['onMenuShareAppMessage','onMenuShareTimeline','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone']
});
}
})
共有の初期化方法:
wx.ready(function(){
wx.onMenuShareAppMessage({
title: "",
desc: "",
link: '',
imgUrl: '',
success: function (res) {
}
}) ,
wx.onMenuShareTimeline({
title: '',
link: '',
imgUrl: '',
success: function () {
}
})
});
完全なコードのフロントエンド:
<template>
<view style="width: auto;height:auto;">
<image src="../../static/share.png" style="width: 100%;height: 100%;" mode='widthFix'></image>
</view>
</template>
<script>
var wx = require('jweixin-module')
export default {
data() {
return {
}
},
onLoad(options) {
uni.request({
url:"/wechat/getSignature",
method:"POST",
data:{
url: window.location.href
},
success: (res) => {
var signature = res.data.data
wx.config({
beta: true,
debug: false,
appId: "appid",
timestamp: signature.timestamp,
nonceStr: signature.noncestr,
signature: signature.signature,
jsApiList: ['onMenuShareAppMessage','onMenuShareTimeline','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone']
});
}
})
wx.ready(function(){
wx.onMenuShareAppMessage({
title: "",
desc: "",
link: '',
imgUrl: '',
success: function (res) {
}
}) ,
wx.onMenuShareTimeline({
title: '',
link: '',
imgUrl: '',
success: function () {
}
})
});
},
methods:{
}
}
</script>
<style>
</style>
終わり!!!