在开发微信公众号遇到的一些问题:
1 验证签名:
需要引入的文件:
<script src="${rc.contextPath}/js/app/public/sha1.js"></script> //sha1加密
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>//微信js
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>//微信js
参与加密的串:
var shareUrl = window.location.href;//当前页面的url
var access_token = document.getElementById("tokenID").value;//token值,这是是后台传过来的
var jsapi_ticket = document.getElementById("ticket").value;//ticket值,后台传过来的
var appSecret = '02101369fa20119c6ca53dd8bacf7a8e';//appSecret
var appId = "wx90c26397dd5fb881";//appId
var curTime = ((new Date()).valueOf()).toString();
var timestamp = curTime.substring(0, 10);//当前时间戳, 10位,
var nonceStr = "Wm3WZYTPz0wzccnW";//nonceStr 值
var str = 'jsapi_ticket=' + jsapi_ticket + '&noncestr=' + nonceStr + '×tamp=' + timestamp + '&url=' + shareUrl;//拼接加密串,注意大小写
var signature = hex_sha1(str);//加密后的串
微信验证:
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: appId, // 必填,公众号的唯一标识
timestamp: timestamp, // 必填,生成签名的时间戳
nonceStr: nonceStr, // 必填,生成签名的随机串
signature: signature, // 必填,签名,见附录1
jsApiList: ['chooseImage', 'uploadImage', 'checkJsApi', 'previewImage', 'openCard', 'onMenuShareTimeline', 'onMenuShareAppMessage','onMenuShareQQ','chooseWXPay'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
检测api是否可用:
wx.checkJsApi({
jsApiList: ['chooseImage', 'uploadImage', 'checkJsApi', 'previewImage', 'openCard', 'onMenuShareTimeline', 'onMenuShareAppMessage','onMenuShareQQ','chooseWXPay'], // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
success: function(res) {
// 以键值对的形式返回,可用的api值true,不可用为false
// console.log("需要检测的JS接口:" + res);
}
});
下面是做过的分享:
wx.ready(function() {
//分享到朋友圈
wx.onMenuShareTimeline({
title: shareTitle, // 分享标题
link: shareUrl, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: imgUrl, // 分享图标
success: function() {
// 用户确认分享后执行的回调函数
shareCalculate("2",pid,"2");
},
cancel: function() {
// 用户取消分享后执行的回调函数
}
});
//分享给个人
wx.onMenuShareAppMessage({
title: shareTitle, // 分享标题
desc: summary, // 分享描述
link: shareUrl, // 分享链接
imgUrl: imgUrl, // 分享图标
type: '', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function() {
// 用户确认分享后执行的回调函数
shareCalculate("2",pid,"1");
},
cancel: function() {
// 用户取消分享后执行的回调函数
}
});
//分享到qq
wx.onMenuShareQQ({
title: shareTitle, // 分享标题
desc: summary, // 分享描述
link: shareUrl, // 分享链接
imgUrl: imgUrl, // 分享图标
success: function() {
// 用户确认分享后执行的回调函数
shareCalculate("2",pid,"3");
},
cancel: function() {
// 用户取消分享后执行的回调函数
}
});
});
微信支付:
wx.chooseWXPay({
"appId": appId, //公众号名称,由商户传入
"timestamp": timestamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
"nonceStr": uuid, // 支付签名随机串,不长于 32 位
"package": order, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
"signType": "MD5", // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
"paySign": paySign, // 支付签名
success: function(res) {
// 支付成功后的回调函数
},
cancel: function(res) {
//支付取消
},
error: function(res) {
//支付失败
}
});
问题1: 使用前,需要在公众号里面将域名添加进去,可以查看微信文档步骤进行添加;
问题2: 验证时要注意大小写;
问题3:支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符;签名方式,默认为'SHA1',使用新版支付需传入'MD5'