微信收货地址开发分享

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

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

相关文章

来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

2586
来自专栏落花落雨不落叶

canvas画简单电路图

63611
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

2665
来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

4788
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2717
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

4878
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4045
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2080
来自专栏转载gongluck的CSDN博客

cocos2dx 打灰机

#include "GamePlane.h" #include "PlaneSprite.h" #include "BulletNode.h" #include...

5606
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.2K7

扫码关注云+社区