最近参与了一个微信活动页面开发,遇到各种问题,总结一下,主要涉及微信jssdk(难点在于微信签名,签名后才能使用jssdk)、微信网页授权获取用户信息、微信公众账号支付这三个部分。
一、微信jssdk的使用
由于要使用微信jssdk需要在微信公众账号里边配置微信js安全域名,如果是正式的公众号时需要备案的域名,并且一个月只能修改三次。
因此开发时我们申请了一个订阅号(订阅号不需要认证,申请起来比较快,但是订阅号不能测试微信公众号支付),然后进入订阅号的开发者工具=》公众平台测试账号=》按照步骤扫二维码进入以下页面
配置js接口安全域名(注意必须是外网可以访问的域名,测试号也可以是ip地址)
因为使用微信jssdk需要签名,签名必须要后端支持,作为一名不会写后台代码的前端开发者来说,自己想测试一下jssdk的功能也是有办法可寻的(如果有后端人员愿意支持你,给你提供签名的接口也是可以的)。
我来讲讲我初步学习使用jssdk的方式。
1.在微信开发者文档
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115&token=&lang=zh_CN
底部提供的链接
http://demo.open.weixin.qq.com/jssdk/sample.zip
下载实例代码,其中包含php、java、nodejs以及python的示例代码;我使用的是php的代码因为搭建服务比较简单,'修改sample.php页面,将测试号的appid\appsecret写到代码对应的位置,然后将要测试的代码房子wx.ready(function(){})里边就可以了
我选择的是新浪云
http://www.sinacloud.com/?from=baidu_web
平台SEA搭建的一个php的云服务,然后通过svn或者git将修改后的代码传到创建的应用里边,通过微信客户端访问创建的应用的网址就可以看到效果了
也可以下载微信web开发者工具,登录自己的微信号就可以在开发者工具里边看到效果并且调试了
二、微信网页授权,获取用户信息
在公众账号中配置授权回调域名
通过微信的授权url,配置appid\回调url,授权后会跳转到回调url,回调的url上微信会自动加上一个code码,然后将code码传给后端,后端用code获取到openid(不通的授权方式获取的用户信息权限不一样)或其他用户信息返回给前端,授权成功
三、微信支付
申请微信公众账号支付,申请成功之后,配置支付授权目录(建议直接使用支付授权目录,不通过测试目录开发),支付授权目录要求如下(虽要求进去匹配,但实际开发过程中,支付页面是/cart/payment,但是只有配置/cart才生效,不知道为什么)
将openid传给后端,后端返回timestamp、nonceStr、package、paySign信息,然后再前端调用一下jssdk(按文档要求需要签名后再调用,但实际测试签名失败调用此sdk也能成功)
wx.chooseWXPay({
timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付 后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: '', // 支付签名随机串,不长于 32 位
package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: '', // 支付签名
success: function (res) {
// 支付成功后的回调函数
},
cancle:function(res){
//取消支付的回调函数
},
fail:function(res){
//支付失败的回调函数
}
});
四、主要遇到的问题和注意事项
1.jssdk签名、微信授权回调地址都是需要外网地址的,这俩个都可以通过申请一个测试号就可以开发,外网地址可以通过第三方云服务,或者下载一个net123/花生壳将外网域名映射到内网ip,如果本身就有外网域名最好
2.微信支付必须要有一个认证的公众号才能开发(订阅号不能认证),并且必须要一个备案的的域名(可以是二级域名)
3.微信公众账号支付最好使用wx.chooseWXPay而不要使用 getBrandWCPayRequest,因为后者是现在新版本的已经不支持了,并且前者更安全
4.一个还未有更好解决方式的问题
对应单页的web app来说,通过react-rooter的push来跳转页面,签名可能存在问题
实际中遇到的问题,在一个用thinkjs+react搭建的触屏版商城中开发微信公众账号支付,该项目是一个单页app,通过react-rooter来管理页面的跳转,整个流程如下:
登录=》微信授权网址=》跳转到回调url=》获取回调url中的code,传给后台获取openid,将openid存储下来
提交订单写道openid过去=》后台返回支付需要的必要参数=》跳转到支付页面/cart/payment=》签名=》调用支付接口
如果用路由自带的push的方法跳转到/cart/payment,那么通过window.location.href.split('#')[0]获取到的url拿去签名会签名失败,但是将首页的url传过去才能成功
但是如果遇到从其他活动直接跳转到提交订单页面(如果没有登录的情况下,会跳转到登录页面)=》登录后回调的url会是之前的url,此时如果再支付iphone5s会一直报当前url未注册(而当前url的地址是提交订单页面),但是iphone6当前url的地址是首页,会导致支付失败,但是安卓手机能够正常支付
最后通过window.location.href跳转到/cart/payment,签名url还是window.location.href.split('#')[0]就都能正常支付,但是对于单页app来说这样的跳转会很慢