您的位置:首页 > 移动开发 > 微信开发

微信JS-SDK实现自定义分享功能,分享给朋友,分享到朋友圈,后台实现

2016-03-23 10:16 1096 查看
           上一篇文章讲了在页面对自定义分享的配置,接下来小编将继续娓娓道来后台对页面需要的参数是如何支持的。微信还真是让人欢喜让人忧。

            前台页面需要的数据这酱紫的:

wx.config({
debug: false,
appId: '${shakeMap.appId}',
timestamp: '${shakeMap.timestamp}',
nonceStr: '${shakeMap.nonceStr}',
signature: '${shakeMap.signature}',
jsApiList: [
'checkJsApi',
'onMenuShareTimeline',
'onMenuShareAppMessage'
]
});
wx.ready(function () {
<%--公共方法--%>
var shareData = {
title: '${title}',
desc: '${description}',
link: '${url}',
imgUrl: '${headImgUrl}',
success: function (res) {
//alert('已分享');
},
cancel: function (res) {
}
};


           那么在后台就应该提供相应的参数和数据值。

           首先APPID是公众号的唯一标识,timestamp是时间戳,nonceStr签名的获取,jsApiList是需要使用得JS接口列表。还有就是公共方法中的对分享链接自定义的标题、描述、链接以及头像等。

标题、描述、链接和头像都是可以在后台设置的,最重要的就是签名,

signatrue签名需要签名机制来生成。

签名机制:

           1、通过access_token采用httpGet方式的请求获取jsapi_ticket(有效期为7200秒),获取方法此处略。

           2、通过得到的jsapi_ticket和随机字符串noncestr,时间戳timestamp,当前网页的URL(不包含#及其后面部分),对这几个参数按照ASCII码从小到大排序(字典序),使用URL键值对的格式(key1=value1&key2=value2…)拼接成字符串string1,这里所有的参数均为小写字符。

           3、然后对string1进行SHA1加密。字段名和字段值都采用原始值,不进行URL转义。
public static Map<String, String> sign(String jsapi_ticket, String url) {
Map<String, String> ret = new HashMap<String, String>();
String nonce_str = create_nonce_str();
String timestamp = create_timestamp();
String string1;
String signature = "";

//注意这里参数名必须全部小写,且必须有序
string1 = "jsapi_ticket=" + jsapi_ticket +
"&noncestr=" + nonce_str +
"×tamp=" + timestamp +
"&url=" + url;
System.out.println(string1);

try
{
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(string1.getBytes("UTF-8"));
signature = byteToHex(crypt.digest());
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}

ret.put("url", url);
ret.put("jsapi_ticket", jsapi_ticket);
ret.put("nonceStr", nonce_str);
ret.put("timestamp", timestamp);
ret.put("signature", signature);

return ret;
}

/**
* 将字节数组转换为十六进制字符串
*/
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
}

/**
* 将字节转换为十六进制字符串
*/
private static String byteToHexStr(byte mByte) {
char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
char[] tempArr = new char[2];
tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
tempArr[1] = Digit[mByte & 0X0F];

String s = new String(tempArr);
return s;
}

private static String create_nonce_str() {
return UUID.randomUUID().toString();
}

private static String create_timestamp() {
return Long.toString(System.currentTimeMillis() / 1000);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: