本文介紹微信支付下的收貨地址共享介面的開發(fā)流程。
一. 簡(jiǎn)介
微信收貨地址共享,是指用戶在微信瀏覽器內(nèi)打開網(wǎng)頁,填寫過地址後,後續(xù)可以免填寫支持快速選擇,也可增加和編輯。此位址為使用者屬性,可在各商家的網(wǎng)頁中共用使用。支援原生控制填寫位址,地址資料會(huì)傳遞到商家。
位址共享是基於微信JavaScript API 實(shí)現(xiàn),只能在微信內(nèi)建瀏覽器中使用,其他瀏覽器呼叫無效。同時(shí),需要微信5.0 版本才能支持,建議透過user agent 來確定使用者目前的版本號(hào)碼後再呼叫位址介面。以iPhone 版本為例,可透過useragent取得以下微信版本範(fàn)例資訊:"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.為使用者安裝的微信版本號(hào),商家可以判定版本號(hào)碼是否高於或等於5.0。
位址格式
微信位址共享使用的資料欄位包括:
#收貨人姓名
地區(qū),省市區(qū)三級(jí)
詳細(xì)地址
#郵編
- ##聯(lián)絡(luò)電話
其中,地區(qū)對(duì)應(yīng)是國(guó)標(biāo)三級(jí)地區(qū)碼,如“廣東省-廣州市-天河區(qū)”,對(duì)應(yīng)的郵編是510630。詳情參考鏈接:http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201401/t20140116_501070.html
?
二. OAuth2.0授權(quán)
取得收貨地址之前前需要呼叫登入授權(quán)介面取得到一次OAuth2.0的Access Token 。所以需要做一次授權(quán),這次授權(quán)是不彈出確認(rèn)框的。
其實(shí)質(zhì)就是在使用者存取
http://www.fangbei.org/wxpay/js_api_call.php
#時(shí)跳到
##
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://www.miracleart.cn/
以此來獲得code參數(shù),並根據(jù)code來獲得授權(quán)access_token及openid,這個(gè)access token將用於收貨地址共享介面。
其實(shí)現(xiàn)的詳細(xì)流程可參考?微信公眾平臺(tái)開發(fā)OAuth2.0網(wǎng)頁授權(quán)
?
二、取得隨機(jī)字串
產(chǎn)生隨機(jī)字串的方法如下
?
#三、產(chǎn)生簽章
參與addrSign 簽章的欄位包含: appId、url(呼叫JavaScript API的網(wǎng)頁url)、timestamp、noncestr、accessToken
對(duì)所有待簽章參數(shù)依照欄位名稱的ASCII 尺寸從小到大排序(字典序)後,使用URL 鍵值對(duì)的格式(即key1=value1&key2=value2…)拼接成字串string1。
這裡要注意的是簽名過程中所有參數(shù)名均為小寫字符,例如appId 在排序後字符串則為appid;
對(duì)string1作簽名算法,字段名和字段值都採用原始值,不進(jìn)行URL 轉(zhuǎn)義。具體簽章演算法為addrSign = SHA1(string1)。這裡給出生成addrSign 的具體範(fàn)例如下:
appId=wx17ef1eaef46752cb
url=http://open.weixin.qq.com/
timeStamp=1384841012
nonceStr=123456
accessToken=OezXcEiiBSKSxW0eoylIeBFk1b8VbNtfWALJ5g6aMgZHaqZwK4euEskSn78Qd5pLsfQtuMdgmhajVM5QDm24W8X3tJ18kz5mhmkUcI3RoLm7qGgh1cEnCHejWQo8s5L3VvsFAdawhFxUuLmgh5FRA
#i:經(jīng)過a過程鍵值排序後得到string1 為:
#accesstoken=OezXcEiiBSKSxW0eoylIeBFk1b8VbNtfWALJ5g6aMgZHaqZwK4euEskSn78Qd5pLsfQtuMdgmhajVM5QDm24W8X3tJ18kz5mhmkUcI3RoLm7qGgh1cEnCHejWQo8s5L3VvsFAdawhFxUuLmgh5FRA&appid=wx17ef1eaef46752cb&noncestr=123456×tamp=1384841012&url=http://open.weixin.qq.com/?code=CODE&state=STATE
ii:經(jīng)過b程序簽章後可得到:
addrSign=SHA1(accesstoken=OezXcEiiBSKSxW0eoylIeBFk1b8VbNtfWALJ5g6aMgZHaqZwK4euEskSn78Qd5pLsfQtuMdgmhajVM5QDm24W8X3tJ18kz5mhmkUcI3RoLm7qGgh1cEnCHejWQo8s5L3VvsFAdawhFxUuLmg
h5FRA&appid=wx17ef1eaef46752cb&noncestr=123456×tamp=1384841012&url=http://open.weixin.qq.com/?code=CODE&state=STATE)=ca604c740945587544a9cc25e58dd090f200e6fb
實(shí)作程式碼如下
?
四、取得收貨地址
編輯並取得使用者收貨地址editAddress接口,在網(wǎng)頁前端呼叫。
參數(shù)清單:
參數(shù)#必填 | 說明 | |
#appId是 | 公眾號(hào)碼appID | |
scope是 | 填入“jsapi_address”,取得編輯位址權(quán)限 | |
signType是 | 簽名方式,目前僅支援SHA1 | |
addrSign是 | 簽名,由各參數(shù)一起參與簽名產(chǎn)生 | |
timeStamp是 | 時(shí)間戳 | |
nonceStr是 | 隨機(jī)字串 | |
調(diào)用方法如下

參數(shù)返回:
返回值 | 說明 |
---|
err_msg | edit_address:ok獲取編輯收貨地址成功 |
edit_address:fail獲取編輯收貨地址失敗 |
username | 收貨人姓名 |
telNumber | 收貨人電話 |
addressPostalCode | 郵編 |
proviceFirstStageName | 國(guó)標(biāo)收貨地址第一級(jí)地址 |
addressCitySecondStageName | 國(guó)標(biāo)收貨地址第二級(jí)地址 |
addressCountiesThirdStageName | 國(guó)標(biāo)收貨地址第三級(jí)地址 |
addressDetailInfo | 詳細(xì)收貨地址信息 |
nationalCode | 收貨地址國(guó)家碼 |
五、示例

六、完整代碼
<?php
/*
方倍工作室 http://www.fangbei.org/
CopyRight 2014 All Rights Reserved
*/
define('APPID', "wx—b7559b828e3c13e");
define('APPSECRET', "2b21b42d0c497de9a691a6bb5048a601");
class class_weixin
{
var $appid = APPID;
var $appsecret = APPSECRET;
//構(gòu)造函數(shù),獲取Access Token
public function __construct($appid = NULL, $appsecret = NULL)
{
if($appid && $appsecret){
$this->appid = $appid;
$this->appsecret = $appsecret;
}
}
//生成OAuth2的URL
public function oauth2_authorize($redirect_url, $scope, $state = NULL)
{
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$this->appid."&redirect_uri=".$redirect_url."&response_type=code&scope=".$scope."&state=".$state."#wechat_redirect";
return $url;
}
//生成OAuth2的Access Token
public function oauth2_access_token($code)
{
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->appid."&secret=".$this->appsecret."&code=".$code."&grant_type=authorization_code";
$res = $this->http_request($url);
return json_decode($res, true);
}
//生成隨機(jī)字符串
function create_noncestr($length = 16)
{
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str = "";
for ($i = 0; $i < $length; $i++ ){
$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);
}
return $str;
}
//生成簽名
function get_biz_sign($bizObj)
{
//參數(shù)小寫
foreach ($bizObj as $k => $v){
$bizParameters[strtolower($k)] = $v;
}
//字典序排序
ksort($bizParameters);
//URL鍵值對(duì)拼成字符串
$buff = "";
foreach ($bizParameters as $k => $v){
$buff .= $k."=".$v."&";
}
//去掉最后一個(gè)多余的&
$buff2 = substr($buff, 0, strlen($buff) - 1);
//sha1簽名
return sha1($buff2);
}
//HTTP請(qǐng)求(支持HTTP/HTTPS,支持GET/POST)
protected function http_request($url, $data = null)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if (!empty($data)){
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
}
<?php
require_once('wxaddr.class.php');
$weixin = new class_weixin();
$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
if (!isset($_GET["code"])){
$jumpurl = $weixin->oauth2_authorize($url, "snsapi_base", "fangbei");
Header("Location: $jumpurl");
}else{
$oauth2_access_token = $weixin->oauth2_access_token($_GET["code"]);
$access_token = $oauth2_access_token['access_token'];
}
$timestamp = strval(time());
$noncestr = $weixin->create_noncestr();
$obj['appId'] = $weixin->appid;
$obj['url'] = $url;
$obj['timeStamp'] = $timestamp;
$obj['noncestr'] = $noncestr;
$obj['accesstoken'] = $access_token;
$signature = $weixin->get_biz_sign($obj);
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>獲取共享收貨地址</title>
<meta name="viewport" content="width=device-width,height=device-height,inital-scale=1.0,maximum-scale=1.0,user-scalable=no;">
<script language="javascript">
function callpay()
{
WeixinJSBridge.invoke('editAddress',{
"appId" : "<?php echo $obj['appId'];?>",
"scope" : "jsapi_address",
"signType" : "sha1",
"addrSign" : "<?php echo $signature;?>",
"timeStamp" : "<?php echo $timestamp;?>",
"nonceStr" : "<?php echo $noncestr;?>",
},function(res){
alert(JSON.stringify(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.national.value = res.nationalCode;
document.form1.user.value = res.userName;
document.form1.phone.value = res.telNumber;
document.form1.postcode.value = res.addressPostalCode;
document.form1.errmsg.value = res.err_msg;
});
}
</script>
</head>
<body>
<form name="form1" target="_blank">
<table border="1">
<colgroup><col width="20%"><col width="80%"></colgroup>
<TR><th>結(jié)果</th><th><INPUT value="" name="errmsg" id="9"></th>
<TR><th>國(guó)家碼</th><th><INPUT value="" name="national" id="6"></th>
<TR><th>國(guó)家</th><th><INPUT value="" name="address3" id="3"></th>
<TR><th>省</th><th><INPUT value="" name="address1" id="1"></th>
<tr><th>市</th><th><INPUT value="" name="address2" id="2"></th>
<TR><th>詳細(xì)</th><th><INPUT value="" name="detail" id="4"></th>
<TR><th>收貨人</th><th><INPUT value="" name="user" id="7"></th>
<TR><th>電話</th><th><INPUT value="" name="phone" id="5"></th>
<TR><th>郵編</th><th><INPUT value="" name="postcode" id="8"></th>
</table>
</form>
<div>
<button type="button" onclick="callpay()">獲取收貨地址</button>
</div>
</body>
</html>
?更多微信支付開發(fā)收貨地址共享接口?相關(guān)文章請(qǐng)關(guān)注PHP中文網(wǎng)!