微信支付的收货地址共享功能, 主要是统一的管理微信用户个人的收货地址, 其收货地址可以被应用于所有可以调用的开发者用户的收货地址包含了很多个人信息, 因此该接口必须要通过申请, 申请的方式可以在 mp 平台上查看到
使用微信获取地址信息是和微信支付一道申请的, 微信支付申请通过, 就可以使用该功能
微信商城中, 使用微信支付获取用户的收货地址, 可以省略用户输入地址信息的繁复流程, 提高用户体验
但是可能是因为牵扯到用户隐私, 所以在使用过程中, 需要用户自己主动选择使用该功能, 并且是通过点击的操作, 我们才可以获取到用户的收货地址, 这一点是要注意的
操作流程如下:
1. 用户打开购物车页面, 点击结算, 跳转到一个微信的 oauth2 的页面, 地址为: https://open.weixin.qq.com/connect/oauth2/authorize
2.oauth2 页面将链接 redirect 到结算页面, 使用 PHP 获取到链接中的 code 参数, 经过处理获取到 accessToken 值生成签名, 组装成数组参数传递到页面
3. 结算页面使用用户点击事件, 结合 2 中生成的数组参数完成获取地址的功能这里可以有一个将获取到的地址使用 ajax 记录到数据库的功能, 那么客户下次购物的时候, 就不用麻烦了
详细的讲下需要注意的几点:
1. 跳转到微信 oauth2 的这个步骤, 在用户看来是没有多少差别的, 但是在程序这里就有很多的事情要做首先是 oauth2 页面的参数, 其中 appid 为微信 appid,redirect_uri 为 urlencode 后的订单结算页面的地址, response_type 为固定的 code,scope 为固定的 snsapi_base,state 在这个地方可随意填写, 还有一个 #wechat_redirect, 那么该链接的最终样子为:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri = 订单结算地址 & response_type=code&scope=snsapi_base&state = 随意填写 #wechat_redirect
2. 用户访问到该地址, 被重新定位到追加了 code 参数订单结算地址, 在此页面需要由程序获取到 accessToken, 注意该 accessToken 为获取用户信息的 accessToken 跟另外一个和微信交互的 access token 不是同一个
使用 GET 请求就可以获取该 accessToken, 可以使用 curl 或者是 file_get_contents 请求地址为:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APP_SECRET&code=CODE&grant_type=authorization_code;
这里有一点需要注意, 有时候微信会抽风, 会连续多次请求订单结算页面, 造成 accessToken 失效, 需特殊处理
这里的签名生成和微信支付里面的签名不一样, 这里的要简单很多, 只是加密一个字符串, 格式为: accesstoken=ACCESSTOKEN&appid=APPID&noncestr=32 位随机字符串 ×tamp = 时间戳 & url = 当前页面的 URL, 然后对该字符串进行 sha1 加密
在前端页面中需要使用一连串的参数来实现获取地址的功能, 分别是 appID,scope(默认为 jsapi_address),signType(默认为 sha1),addrSign(上面 sha1 加密后的字符串),timeStamp(同上文的时间戳),nonceStr(同上文的随机字符串)
3. 在前端页面, 使用下面的 js 函数来完成获取用户地址的操作:
- function get_addr()
- {
- WeixinJSBridge.invoke('editAddress',{
- "appId" : "<?php echo $sign['appId']?>",
- "scope" : "jsapi_address",
- "signType" : "sha1",
- "addrSign" : "<?php echo $sign['addrSign']?>",
- "timeStamp" : "<?php echo $sign['timeStamp']?>",
- "nonceStr" : "<?php echo $sign['nonceStr']?>",
- },function(res){
- if(res.err_msg == 'edit_address:ok')
- {
- // 将地址信息存入数据库
- // 将地址信息显示在当前页面
- document.getElementById("address_info").innerhtml="收件人:"+res.userName+""+res.telNumber+"
收货地址:"+res.proviceFirstStageName+res.addressCitySecondStageName+res.addressCountiesThirdStageName+res.addressDetailInfo;
} else{ alert("获取地址失败, 请重新点击"); } }); }
至此, 使用微信获取用户共享地址的开发就完毕了
来源: https://www.php1.cn/detail/php-325b245fb9.html