微信支付開發(6) 收貨地址共享接口


關鍵字:微信支付 收貨地址共享
作者:方倍工作室
原文: http://www.cnblogs.com/txw1958/p/weixin-editAddress.html

 

請看新版教程  微信支付開發(7) 收貨地址共享接口V2

 

本文介紹微信支付下的收貨地址共享接口的開發過程。

一. 簡介

微信收貨地址共享,是指用戶在微信瀏覽器內打開網頁,填寫過地址后,后續可以免填寫支持快速選擇,也可增加和編輯。此地址為用戶屬性,可在各商戶的網頁中共享使用。支持原生控件填寫地址,地址數據會傳遞到商戶。

地址共享是基於微信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。

地址格式
微信地址共享使用的數據字段包括:

  • 收貨人姓名
  • 地區,省市區三級
  • 詳細地址
  • 郵編
  • 聯系電話

其中,地區對應是國標三級地區碼,如“廣東省-廣州市-天河區”,對應的郵編是是510630。詳情參考鏈接:http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201401/t20140116_501070.html

 

二. OAuth2.0授權

獲取收貨地址之前前需要調用 登錄授權接口獲取到一次OAuth2.0的Access Token 。所以需要做一次授權,這次授權是不彈出確認框的。
其實質就是在用戶訪問

http://www.fangbei.org/wxpay/js_api_call.php

時跳轉到

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://www.fangbei.org/wxpay/js_api_call.php&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect

以此來獲得code參數,並根據code來獲得授權access_token及openid,這個access token將用於收貨地址共享接口。

其實現的詳細流程可參考 微信公眾平台開發(71)OAuth2.0網頁授權

 

二、獲取隨機字符串

生成隨機字符串的方法如下

 

三、生成簽名

參與addrSign 簽名的字段包括:appId、url(調用JavaScript API的網頁url)、timestamp、noncestr、accessToken
對所有待簽名參數按照字段名的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/?code=CODE&state=STATE

ii:經過b過程簽名后可得到:

addrSign=SHA1(accesstoken=OezXcEiiBSKSxW0eoylIeBFk1b8VbNtfWALJ5g6aMgZHaqZwK4euEskSn78Qd5pLsfQtuMdgmhajVM5QDm24W8X3tJ18kz5mhmkUcI3RoLm7qGgh1cEnCHejWQo8s5L3VvsFAdawhFxUuLmg
h5FRA&appid=wx17ef1eaef46752cb&noncestr=123456&timestamp=1384841012&url=http://open.weixin.qq.com/?code=CODE&state=STATE)=ca604c740945587544a9cc25e58dd090f200e6fb

實現代碼如下

 

四、獲得收貨地址

編輯並獲取用戶收貨地址editAddress接口,在網頁前端調用。
參數列表:

參數 必填 說明
appId 公眾號appID
scope 填寫“jsapi_address”,獲得編輯地址權限
signType 簽名方式,目前僅支持SHA1
addrSign 簽名,由各參數一起參與簽名生成
timeStamp 時間戳
nonceStr 隨機字符串

調用方法如下

參數返回:

返回值 說明
err_msg edit_address:ok獲取編輯收貨地址成功
edit_address:fail獲取編輯收貨地址失敗
username 收貨人姓名
telNumber 收貨人電話
addressPostalCode 郵編
proviceFirstStageName 國標收貨地址第一級地址
addressCitySecondStageName 國標收貨地址第二級地址
addressCountiesThirdStageName 國標收貨地址第三級地址
addressDetailInfo 詳細收貨地址信息
nationalCode 收貨地址國家碼

 

 

五、示例

    

 

六、完整代碼

<?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;

    //構造函數,獲取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);
    }

    //生成隨機字符串
    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)
    {
        //參數小寫
        foreach ($bizObj as $k => $v){
            $bizParameters[strtolower($k)] = $v;
        }
        //字典序排序
        ksort($bizParameters);
        //URL鍵值對拼成字符串
        $buff = "";
        foreach ($bizParameters as $k => $v){
            $buff .= $k."=".$v."&";
        }
        //去掉最后一個多余的&
        $buff2 = substr($buff, 0, strlen($buff) - 1);
        //sha1簽名
        return sha1($buff2);
    }

    //HTTP請求(支持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>結果</th><th><INPUT value="" name="errmsg" id="9"></th>
                <TR><th>國家碼</th><th><INPUT value="" name="national" id="6"></th>
                <TR><th>國家</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>詳細</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>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM