欢迎访问 夜阑小雨 我的学习碎片档案,这里记录了我的学习内容和工作中经验,希望给您带去帮助。

获取微信支付共享收货地址

微信开发 夜阑小雨 12617℃

微信支付的收货地址共享功能,主要是统一的管理微信用户个人的收货地址,其收货地址可以被应用于所有可以调用的开发者。用户的收货地址包含了很多个人信息,因此该接口必须要通过申请,申请的方式可以在mp平台上查看到。

申请开通

包含微信支付功能时,则需要配置微信的支付目录(支付目录为绝对路径,例如支付接口为wxpay.php,而该文件在wxpay目录下,那么支付目录必须写成http://test.mc.com/wxpay),配置该目录权限时候需要添加“可编辑和拉取共享地址”权限,这样开发者可以在该授权目录拉取共享收货地址。其次需要修改用户的oauth授权域名,将其域名修改为相应的授权目录的域名即可。例如我的授权目录是http://test.mc.com/wxpay/,那么oauth的授权域名则为test.mc.com。

共享收货地址开发

在开发前首先要明确拉取共享收货地址需要的参数配置,如下:

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、微信提示拒绝访问

授权目录错误,请确认自己的授权目录是否为绝对路径,或者是否申请开通授权目录。

2、拉取收货地址提示fail,第一种情况

这个很多时候是签名出错,签名出错又包含以下几个错误

A)签名参数必须小写,也就是说你的签名参数名存在大写的。

B)加密所使用的token信息为用户oauth时候所返回的token信息,并非官号的token

C)参与签名使用的url必须带上微信服务器返回的code和state参数,这部分就是要保证拉起收货地址的页面url必须要与加密生成签名的url完全一致。其次,签名使用的url必须是调用时所在页面的url,此url域名要不填写Oauth2.0授权域名一致。

3、拉取收货地址提示fail,第二种情况

A)调用接口参数必须用字符串格式,主要是timeStamp和nonceStr两个值,必须要保证是字符串格式;

B)传递给微信的timeStamp和nonceStr必须是参与生成addrSign签名的值;

具体的可以参考我的demo。

需要注意的地方:

1.文件必须放到 微信支付的授权目录下面
2.必须获取用户的微信OAuth2.0授权,获取code。
这个code是获取access_token的关键。必须获取到,如果仅仅测试可以通过这个连接测试:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=您的appid&redirect_uri=http://您的支付授权目录/addr.php&response_type=code&scope=snsapi_base&state=1#wechat_redir
3.如果提前已经获取到code信息,就可以可以通过改造addr.php文件来获取access_token
url必须是你当前的url地址:http://的支付授权目录/addr.php?code=0081d32ef9f0e62a22541c28d48d5d58&state=1#wechat_redir

 

主要流程步骤:

1.通过网页授权获取用户的code。

https://open.weixin.qq.com/connect/oauth2/authorize?appid=您的APPID&redirect_uri=http://您的支付授权目录及你的获取共享地址的文件&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

2.一旦获取到后,code可以存储,并保证获取共享地址中包含这个code和&state=1#wechat_redir ,当然直接跳转,他会自己带上code=0081d32ef9f0e62a22541c28d48d5d58&state=1#wechat_redir 这些参数。

3.通过code换取网页授权access_token。
https://api.weixin.qq.com/sns/oauth2/access_token?appid=您的APPID&secret=您的SECRET&code=您的CODE&grant_type=authorization_code
这个access_token是获取地址控件签名的关键
具体如何获取根据代码中的方法

4.获取地址控件签名。
其中主要的$url 和 $accesstoken 这2个参数。

url必须与调用页面的url完全一致,包含参数。其中微信要求参与签名使用的url必须带上微信服务器返回的code和state参数,因此访问页面也必须携带两个参数,

比如:我们获取到code之后跳转的页面url是http://的支付授权目录/addr.php
当获取code之后 就成了http://的支付授权目录/addr.php?code=0081d32ef9f0e62a22541c28d48d5d58&state=1#wechat_redir。
那么这个url将参与获取签名。

$accesstoken 这个参数就是第二步获取的$accesstoken。这个获取可以根据代码里面的方法。

5.获取到 addrSign 这个值之后就可以构建一个js方法, 来触发调用地址控件。
function getaddr(){

WeixinJSBridge.invoke(‘editAddress’,{
“appId” : “<?php echo $appid ?>”,
“scope” : “jsapi_address”,
“signType” : “sha1”,
“addrSign” : “<?php echo $addrsign ?>”,
“timeStamp” : “<?php echo $timestamp ?>”,
“nonceStr” : “<?php echo $noncestr ?>”,
},function(res){ }

}

6.当然以上的获取code 获去access_token,获取签名都可以在业务流程php程序中处理好之后直接传到当前页面,但是该页面必须
http://的支付授权目录/addr.php?code=0081d32ef9f0e62a22541c28d48d5d58&state=1#wechat_redir。 这样的url结构。
就是说你当前页面获取地址控件的的url地址,必须保证和获取签名时用的url保证一直。

 

微信支付获取共享地址 addrdemo

 

转载请注明:夜阑小雨 » 获取微信支付共享收货地址

喜欢 (1)or分享 (0)