微信自动获取收货地址api实现

一、功能简介
1、简介
微信收货地址共享,是指用户在微信浏览器内打开网页,填写过地址后,后续可以免填写支持快速选择,也可增加和编辑。
此地址为用户属性,可在各商户的网页中共享使用。支持原生控件填写地址,地址数据会传递到商户。
2、功能支持
地址共享是基于微信JavaScript API 实现,只能在微信内置浏览器中使用,其他浏览器调用无效。同时,需要微信5.0 版本才能支持,建议通过user agent 来确定用户当前的版本号后再调用地址接口。
以iPhone 版本为例,可以通过useragent可获取如下微信版本示例信息:”Mozilla/5.0(iphone;CPU iphone OS 5_1_1 like Mac OS X)AppleWebKit/534.46(KHTML,like Geocko) Mobile/9B206MicroMessenger/5.0″其中5.0 为用户安装的微信版本号,商户可以判定版本号是否高于或者等于5.0。
3、地址格式
微信地址共享使用的数据字段包括:
– 收货人姓名
– 地区,省市区三级
– 详细地址
– 邮编
– 联系电话
其中,地区对应是国标三级地区码,如“广东省-广州市-天河区”,对应的邮编是是510630。详情参考链接:http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201401/t20140116_501070.html
二、接口说明
1、编辑并获取收货地址
编辑并获取用户收货地址editAddress接口,在网页前端调用。
参数列表:

参数
必填
说明
appId

公众号appID
scope

填写“jsapi_address”,获得编辑地址权限
signType

签名方式,目前仅支持SHA1
addrSign

签名,由各参数一起参与签名生成
timeStamp

时间戳
nonceStr

随机字符串
注意:
参与addrSign 签名的字段包括:appId、url(调用JavaScript API的网页url)、timestamp、noncestr、accessToken,请参照网页授权接口(http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html)获取accessToken。获取accessToken需要获取Code和经过微信后台页面回调,这一步很容易出错,请开发者仔细阅读网页授权接口的规范。
注意,用网页授权接口,获取accessToken的scope是snsapi_base(和前端网页JavaScript API传入的scope不同)。因为使用了网页授权接口,url是经过微信回调后打开的,所以参与签名使用的url必须带上微信服务器返回的code和state参数。
这里scope、signType 并不参与签名。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL 键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。
这里需要注意的是签名过程中所有参数名均为小写字符,例如appId 在排序后字符串则为appid;
对string1作签名算法,字段名和字段值都采用原始值,不进行URL 转义。具体签名算法为addrSign = SHA1(string1)。这里给出生成addrSign 的具体示例如下:
appId=wx17ef1eaef46752cb
url=http://open.weixin.qq.com/
timeStamp=1384841012
nonceStr=123456
accessToken=OezXcEiiBSKSxW0eoylIeBFk1b8VbNtfWALJ5g6aMgZHaqZwK4euEskSn78Qd5pLsfQtuMdgmhajVM5QDm24W8X3tJ18kz5mhmkUcI3RoLm7qGgh1cEnCHejWQo8s5L3VvsFAdawhFxUuLmgh5FRA
i:经过a过程键值对排序后得到string1 为:
accesstoken=OezXcEiiBSKSxW0eoylIeBFk1b8VbNtfWALJ5g6aMgZHaqZwK4euEskSn78Qd5pLsfQtuMdgmhajVM5QDm24W8X3tJ18kz5mhmkUcI3RoLm7qGgh1cEnCHejWQo8s5L3VvsFAdawhFxUuLmgh5FRA&appid=wx17ef1eaef46752cb&noncestr=123456&timestamp=1384841012&url=http://open.weixin.qq.com/
ii:经过b过程签名后可得到:
addrSign=SHA1(accesstoken=OezXcEiiBSKSxW0eoylIeBFk1b8VbNtfWALJ5g6aMgZHaqZwK4euEskSn78Qd5pLsfQtuMdgmhajVM5QDm24W8X3tJ18kz5mhmkUcI3RoLm7qGgh1cEnCHejWQo8s5L3VvsFAdawhFxUuLmg
h5FRA&appid=wx17ef1eaef46752cb&noncestr=123456&timestamp=1384841012&url=http://open.weixin.qq.com/)=ca604c740945587544a9cc25e58dd090f200e6fb
参数返回:

返回值
说明
err_msg
edit_address:ok获取编辑收货地址成功
edit_address:fail获取编辑收货地址失败
username
收货人姓名
telNumber
收货人电话
addressPostalCode
邮编
proviceFirstStageName
国标收货地址第一级地址
addressCitySecondStageName
国标收货地址第二级地址
addressCountiesThirdStageName
国标收货地址第三级地址
addressDetailInfo
详细收货地址信息
nationalCode
收货地址国家码
使用示例:

WeixinJSBridge.invoke(‘editAddress’, {
“appId”: getAppId(),
“scope”: “jsapi_address”,
“signType”: “sha1”,
“addrSign”: “xxxxx”,
“timeStamp”: “12345”,
“nonceStr”: “10000”,
}, function (res) {
//若res 中所带的返回值不为空,则表示用户选择该返回值作为收货地址。
//否则若返回空,则表示用户取消了这一次编辑收货地址。
document.form1.address1.value = res.proviceFirstStageName;
document.form1.address2.value = res.addressCitySecondStageName;
document.form1.address3.value = res.addressCountiesThirdStageName;
document.form1.detail.value = res.addressDetailInfo;
document.form1.phone.value = res.telNumber;
});
});
注意:很多开发者遇到参数签名的问题,请保证签名算法和参数正确,传入JavaScript API的参数保证是字符串格式,签名过程中所有参数名均为小写字符。
三、交互流程
基本交互流程如下:

四、权限申请简介
(1)若要获取收货地址相关JavaScript API ,需要先申请具有微信支付权限的公众号;
(2)在获取具有支付权限的appID 后,默认已开启收货地址相关JS API 权限,但需要商家配置对应使用收货地址功能的域名,域名配置请在公众平台网站-开发者中心-配置项-网页服务-网页授权获取用户基本信息中设置,如下图:

点击修改,把授权回调页面域名设置为使用收货地址功能的域名即可。
五、常见问题
1、参与签名参数必须小写,否则将会报错,请仔细核对签名流程。
2、调用接口的appId、scope、signType、addrSign、timeStamp、nonceStr参数必须用字符串格式,在JavaScript代码中以字符串传入参数。部分开发者遇到Android调用正常,iPhone调用失败的情况,很可能是JavaScript API传入的参数没有使用字符串格式,因为部分Android系统做了自动转换,但iPhone系统没有。
3、获取accessToken使用网页授权接口,获取accessToken的scope是snsapi_base(和JavaScript API传入的scope不同),网页授权接口请参考http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html。
4、如果参数签名错误,会报错eidt_ address:fail或者eidtAddress:fail_auth_error。请使用文档的样例数据,验证签名算法正确性。
5、签名使用的url必须是调用JavaScript API时所在页面的url,此url需要符合网页授权接口Oauth2.0的域名,见上文权限申请,
6、因为使用了网页授权接口,url是经过微信回调后打开的,所以参与签名使用的url必须带上微信服务器返回的code和state参数。
7、常见报错

错误返回值
说明
system:access_denied
没有权限,可能该商户权限或者该url域名权限不足,请参考权限申请简介。
system:function_not_exist
JavaScript方法不存在,当前客户端版本不支持该接口,请升级到新版体验。
fail_unkonwPermission_
权限值异常。
fail_invalid url domain
该url域名无权限,当前页面所在域名与使用的appid没有绑定,要正确填写绑定的域名,如果使用了端口号,则配置的绑定域名也要加上端口号,请参考权限申请简介。
8、联系我们
如果遇到收货地址相关的问题,请邮箱联系我们weixin-open@qq.com。
邮件主题:【微信JS-API收货地址接口问题反馈】
邮件内容说明:
用简明的语言描述问题所在,并交代清楚遇到该问题的场景,可附上截屏图片,微信团队会尽快处理你的反馈。

以上是官方文档。

实现代码:

[code lang=”php”]

public function get_address_api(){
$APPID=C(‘APPID’);
$SCRETID=C(‘SCRETID’);
if (!isset($_GET[‘code’]))
{
$backurl = $this->get_url();
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$APPID."&redirect_uri=".urlencode($backurl)."&response_type=code&scope=jsapi_address&state=123#wechat_redirect"; // snsapi_userinfo
Header("Location: $url");
exit;
}else
{
$code = $_GET[‘code’];
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$APPID."&secret=".$SCRETID."&code=".$code."&grant_type=authorization_code";
$re = file_get_contents($url);
$rearr = json_decode($re,true);
$backurl = $this->get_url();
$openid = $rearr[‘openid’];
$unionid = $rearr[‘unionid’];
$asstoken = $rearr[‘access_token’];
S(‘jsapi_address_token’.$openid,$asstoken,7200);

$data[‘appid’]=$APPID;
$data[‘url’]=$backurl;
$data[‘timestamp’]=time();
$data[‘timestamp’]= (string)($data[‘timestamp’]);
$data[‘noncestr’]=$this->getRandStr(10);
$data[‘accesstoken’]=$asstoken;

foreach ($data as $k => $v)
{
$Parameters[$k] = $v;
}
//签名步骤一:按字典序排序参数
ksort($Parameters);
$String = $this->formatBizQueryParaMap($Parameters, false);
$data[‘addrsign’]=SHA1($String);
$this->assign(‘data’,$data);

}

$this->siteDisplay(‘address_api’);

}

[/code]