微信收货地址开发分享

微信支付做了有一定时间了,现在就来做一些知识的总结,总体来说微信支付的文档不是非常的完美,其中存在一些问题。虽然坑很多,但是还是把问题解决了。

微信支付的收货地址共享功能,主要是统一的管理微信用户个人的收货地址,其收货地址可以被应用于所有可以调用的开发者。用户的收货地址包含了很多个人信息,因此该接口必须要通过申请,申请的方式可以在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必须带上微信服务器返回的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必须带上微信服务器返回的code和state参数,这部分就是要保证拉起收货地址的页面url必须要与加密生成签名的url完全一致。其次,签名使用的url必须是调用时所在页面的url,此url域名要不填写Oauth2.0授权域名一致。

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

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

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

DEMO下载地址

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端vue

Vue+SessionStorage实现简单的登录

我是基于vue脚手架cli做的,没用过cli的可以看下我之前写的cli脚手架搭建

5.6K3
来自专栏北京马哥教育

成为 Linux 终端高手的七种武器

Linux 终端不仅是一个键入命令的地方。如若你能熟谙这些基础技巧,那么你会在绝大多数 Linux 发行版的默认使用的 Bash shell中游刃有余。 这是...

2948
来自专栏c#开发者

Vs.net 2008 sp1新特性之Dynamic Data Web Site

Vs.net 2008 sp1新特性之Dynamic Data Web Site 介绍 asp.net的动态数据,是一个web site开发框架,可让您很容...

3445
来自专栏java相关

非常全面的vim配置文件

1983
来自专栏lgp20151222

tar包和jar包和war包的区别?

tar:tar是*nix下的打包工具,生成的包通常也用tar作为扩展名,其实tar只是负责打包,不一定有压缩,事实上可以压缩,也可以不压缩,通常你看到xxxx....

1102
来自专栏coder修行路

aiohttp文档翻译-server(一)

一个 request handler 必须是一个coroutine (协程), 它接受一个Request实例作为其唯一参数,并返回一个Response 实例,如...

1302
来自专栏知晓程序

开发 | 只需 10 分钟,教你做一款查询类小程序

在全局配置文件中,我们定义了一个页面。保存之后,将会自动生成 index 页面的基本目录。

1203
来自专栏Golang语言社区

Go语言基于Socket编写服务器端与客户端通信的实例

在golang中,网络协议已经被封装的非常完好了,想要写一个Socket的Server,我们并不用像其他语言那样需要为socket、bind、listen、re...

4004
来自专栏技术博文

解决安卓微信浏览器中location.reload 或者 location.href失效的问题

在移动wap中,经常会使用window.location.href去跳转页面,这个方法在绝大多数浏览器中都不会  存在问题,但早上测试的同学会提出了一个bug:...

7567
来自专栏烂笔头

Linux笔记:使用Vim编辑器

目录[-] Vi编辑器是Unix系统上早先的编辑器,在GNU项目将Vi编辑器移植到开源世界时,他们决定对其作一些改进。 于它不再是以前Unix中的那...

3814

扫码关注云+社区

领取腾讯云代金券