微信收货地址开发分享

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

微信支付的收货地址共享功能,主要是统一的管理微信用户个人的收货地址,其收货地址可以被应用于所有可以调用的开发者。用户的收货地址包含了很多个人信息,因此该接口必须要通过申请,申请的方式可以在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 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Linux初级运维常用命令面试问题

各位小伙伴快来看看这里的基础题目都能完全掌握嘛? 欢迎各路大神留言或投稿自己遇到的面试题目! 请小伙伴们先只看以下题目部分,自己先思考下答案!(不要偷看后面的答...

2805
来自专栏C++

python笔记:#006#程序执行原理

741
来自专栏Linyb极客之路

APP架构设计经验谈:接口的设计

App与服务器的通信接口如何设计得好,需要考虑的地方挺多的,在此根据我的一些经验做一些总结分享,旨在抛砖引玉。

683
来自专栏欧阳大哥的轮子

iOS应用程序的脱壳实现原理浅析

对于诸多逆向爱好者来说,给一个app脱壳是一项必做的事情。基于安全性的考虑,苹果对上架到appstore的应用都会进行加密处理,所以如果直接逆向一个从appst...

603
来自专栏Keegan小钢

App架构设计经验谈:接口的设计

App与服务器的通信接口如何设计得好,需要考虑的地方挺多的,在此根据我的一些经验做一些总结分享,旨在抛砖引玉。

793
来自专栏文武兼修ing——机器学习与IC设计

selenium初探selenium初探

selenium初探 selenium简介与安装 简介 selenium是一个网站的自动化测试库,但由于其具有大量的自动化库而且可以调用浏览器,常常被用于爬虫技...

2816
来自专栏程序小工

MySQL数据库常见名词对比

MySQL 由于性能高、成本低、可靠性好,已经成为最流行的开源数据库,因此被广泛地应用在 Internet 上的中小型网站中。随着 MySQL 的不断成熟,它也...

923
来自专栏Android 研究

Android启动流程——1序言、bootloader引导与Linux启动

前面讲解的很多内容都很抽象,所以本次系列决定"接点地气",准备开始讲解大家熟悉的Activity了,为了让我以及大家更好的理解Activity,我决定本系列...

1481
来自专栏后端之路

mysql的query end status

背景 由于业务中有备份某个业务表的定时任务 会在每天指定时间点做一次备份【使用quartz】 各位也都知道各种timeout的相关问题 socketTimeou...

4156
来自专栏微信公众号:Java团长

深入理解Java虚拟机到底是什么

作为一个Java程序员,我们每天都在写Java代码,我们写的代码都是在一个叫做Java虚拟机的东西上执行的。但是如果要问什么是虚拟机,恐怕很多人就会模棱两可了。...

1213

扫码关注云+社区