微信支付做了有一定时间了,如今就来做一些知识的总结,整体来说微信支付的文档不是非常的完美。当中存在一些问题。
尽管坑非常多。可是还是把问题攻克了。
微信支付的收货地址共享功能,主要是统一的管理微信用户个人的收货地址。其收货地址能够被应用于全部能够调用的开发人员。用户的收货地址包括了非常多个人信息,因此该接口必须要通过申请。申请的方式能够在mp平台上查看到。
申请开通
包括微信支付功能时。则须要配置微信的支付文件夹(支付文件夹为绝对路径,比如支付接口为wxpay.php,而该文件在wxpay文件夹下,那么支付文件夹必须写成http://test.mc.com/wxpay),配置该文件夹权限时候须要加入“可编辑和拉取共享地址”权限,这样开发人员能够在该授权文件夹拉取共享收货地址。其次须要改动用户的oauth授权域名,将其域名改动为对应的授权文件夹的域名就可以。比如我的授权文件夹是http://test.mc.com/wxpay/,那么oauth的授权域名则为test.mc.com。
接口开发
在开发前首先得去验证一下权限是否正确。因此你须要使用例如以下的demo,该demo能够帮助你验证文件夹权限是否正确,假设demo未跑通,则说明权限存在问题。
Demo校验权限
将demo解压。并将代码部分放到你的授权文件夹(请注意这里是代码部分,非addrdemo文件夹)。改动配置文件config.php,将你所需的配置填写完整,改动完毕后,使用微信訪问连接:授权文件夹/addr.php
假设demo正常拉取的话。接下来你就能够进行正常逻辑的开发了。
共享收货地址开发
在开发前首先要明白拉取共享收货地址须要的參数配置,例如以下:
appId已知參数。scope(默认參数jsapi_address),signType (默认參数sha1),addrSign(须要生成參数),timeStamp(加密和解密所需參数),nonceStr(加密解密所需參数)。
通过简单分析。我们能够看出,须要我们生成的就是一个addrSign值。而这个值依赖与timeStamp和nonceStr。因此在给微信的參数中的timeStamp和nonceStr必须要和加密生成addrSign的值全然一致。
addrSign的生成过程,官网提供的样例是存在缺漏的。可是并不影响整个的生成方式,其介绍说:
addrSign 的生成规则例如以下。參与addrSign 签名的字段包括:appId、url(当前网页url)、timestamp、noncestr、accessToken(用户授权凭证,请參照oauth2.0 协议获取)。
这里scope、signType 并不參与签名。
1、对全部待签名參数依照字段名的ASCII 码从小到大排序(字典序)后,使用URL 键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。
要注意的是全部參数名均为小写字符,比如appId 在排序后字符串则为appid。
这里的意思非常明白的表示參与的全部字段的键名必须是小写。
2、对string1作签名算法,字段名和字段值都採用原始值,不进行URL 转义。签名算法为addrSign = SHA1(string1)。
非常多时候大家看到官网提供的加密后字符与字符串的sha1结果不符合。事实上大家不要在意。也不要存在疑惑是否是由于自己的sha1加密算法和微信的不一致。官网提供的样例是存在问题的。
实际举比例如以下
1、加密字符串
appid=wx17ef1eaef46752cb
url=http://open.weixin.qq.com/
timestamp=1384841012
noncestr=123456
accesstoken=OezXcEiiBSKSxW0eoylIeBFk1b8VbNtfWALJ5g6aMgZHaqZwK4euEskSn78Qd5pLsfQtuMdgmhajVM5QDm24W8X3tJ18kz5mhmkUcI3RoLm7qGgh1cEnCHejWQo8s5L3VvsFAdawhFxUuLmgh5FRA
注意以上參数中的url。这个url为你须要拉起收货地址的调用页面。注意这个url必须与调用页面的url全然一致。包括參数。
当中微信要求參与签名使用的url必须带上微信server返回的code和state參数,因此訪问页面也必须携带两个參数。比如我们的加密url是:
http://test.mc.com/wxpay/addr.php?
code=123&state=cft
那么我们拉取收货地址的页面http://test.mc.com/wxpay/addr.php也必须携带两个參数。也就是訪问页面须要设置为http://test.mc.com/wxpay/addr.php?
code=123&state=cft。
2、经过排序后的字符串
accesstoken=OezXcEiiBSKSxW0eoylIeBFk1b8VbNtfWALJ5g6aMgZHaqZwK4euEskSn78Qd5pLsfQtuMdgmhajVM5QDm24W8X3tJ18kz5mhmkUcI3RoLm7qGgh1cEnCHejWQo8s5L3VvsFAdawhFxUuLmgh5FRA&appid=wx17ef1eaef46752cb&noncestr=123456×tamp=1384841012&url=http://open.weixin.qq.com/
3、加密生成addrSign
addrSign=SHA1(accesstoken=OezXcEiiBSKSxW0eoylIeBFk1b8VbNtfWALJ5g6aMgZHaqZwK4euEskSn78Qd5pLsfQtuMdgmhajVM5QDm24W8X3tJ18kz5mhmkUcI3RoLm7qGgh1cEnCHejWQo8s5L3VvsFAdawhFxUuLmgh5FRA&appid=wx17ef1eaef46752cb&noncestr=123456×tamp=1384841012&url=http://open.weixin.qq.com/)=382aba817fa72b01fe8029a3b4020862
那么这些过程中你会遇到哪些问题呢?
1、微信提示拒绝訪问
授权文件夹错误,请确认自己的授权文件夹是否为绝对路径。或者是否申请开通授权文件夹。
2、拉取收货地址提示fail,第一种情况
这个非常多时候是签名出错,签名出错又包括下面几个错误
A)签名參数必须小写。也就是说你的签名參数名存在大写的。
B)加密所使用的token信息为用户oauth时候所返回的token信息,并不是官号的token
C)參与签名使用的url必须带上微信server返回的code和state參数,这部分就是要保证拉起收货地址的页面url必须要与加密生成签名的url全然一致。其次,签名使用的url必须是调用时所在页面的url,此url域名要不填写Oauth2.0授权域名一致。
3、拉取收货地址提示fail。另外一种情况
A)调用接口參数必须用字符串格式,主要是timeStamp和nonceStr两个值,必须要保证是字符串格式;
B)传递给微信的timeStamp和nonceStr必须是參与生成addrSign签名的值;