微信收货地址开发分享



微信支付做了有一定时间了,如今就来做一些知识的总结,整体来说微信支付的文档不是非常的完美。当中存在一些问题。

尽管坑非常多。可是还是把问题攻克了。

微信支付的收货地址共享功能,主要是统一的管理微信用户个人的收货地址。其收货地址能够被应用于全部能够调用的开发人员。用户的收货地址包括了非常多个人信息,因此该接口必须要通过申请。申请的方式能够在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值。而这个值依赖与timeStampnonceStr。因此在给微信的參数中的timeStampnonceStr必须要和加密生成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返回的codestate參数,因此訪问页面也必须携带两个參数。比如我们的加密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返回的codestate參数,这部分就是要保证拉起收货地址的页面url必须要与加密生成签名的url全然一致。其次,签名使用的url必须是调用时所在页面的url,此url域名要不填写Oauth2.0授权域名一致。

3、拉取收货地址提示fail。另外一种情况

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

B)传递给微信的timeStampnonceStr必须是參与生成addrSign签名的值;


DEMO下载地址


posted @ 2016-03-12 14:30  phlsheji  阅读(1219)  评论(0编辑  收藏  举报