> 위챗 애플릿 > 위챗 개발 > WeChat Pay, 배송 주소 공유 인터페이스 개발

WeChat Pay, 배송 주소 공유 인터페이스 개발

高洛峰
풀어 주다: 2017-03-06 10:10:00
원래의
4482명이 탐색했습니다.

이 글에서는 위챗 결제에서의 배송 주소 공유 인터페이스 개발 과정을 소개합니다.

1. 소개

WeChat 배송 주소 공유는 사용자가 WeChat 브라우저에서 웹페이지를 열고 주소를 입력하는 것을 의미하며 빠른 선택을 지원하기 위해 후속 입력이 필요하지 않습니다. 또한 추가 및 편집할 수 있습니다. 이 주소는 사용자 속성이며 다양한 판매자의 웹페이지에서 공유될 수 있습니다. 주소를 입력하는 기본 컨트롤을 지원하며 주소 데이터가 판매자에게 전달됩니다.

주소 공유는 WeChat JavaScript API를 기반으로 하며 WeChat 내장 브라우저에서만 사용할 수 있으며 다른 브라우저에서의 호출은 유효하지 않습니다. 동시에 이를 지원하려면 WeChat 버전 5.0이 필요합니다. 주소 인터페이스를 호출하기 전에 사용자 에이전트를 사용하여 사용자의 현재 버전 번호를 확인하는 것이 좋습니다. iPhone 버전을 예로 들면, useragent를 통해 다음 WeChat 버전 샘플 정보를 얻을 수 있습니다: "Mozilla/5.0(iphone;CPU iphone OS 5_1_1 like Mac OS) 사용자가 설치한 WeChat 버전 번호에 대해 판매자는 여부를 결정할 수 있습니다. 버전 번호가 5.0 이상입니다.

주소 형식
WeChat 주소 공유에 사용되는 데이터 필드는 다음과 같습니다.

  • 수취인 이름

  • 지역, 주 및 지자체 3급

  • 상세 주소

  • 우편번호

  • 연락처

그 중 지역은 "광동성-광저우시-천하구" 등 국가 표준 3단계 지역번호에 해당하며 해당 우편번호는 510630입니다. 자세한 내용은 참고 링크: http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/201401/t20140116_501070.html

2. 🎜 >배송 주소를 받기 전에 로그인 인증 인터페이스를 호출하여 OAuth2.0 액세스 토큰을 받아야 합니다. 따라서 인증은 한 번만 수행해야 하며, 해당 인증에 대해서는 확인 상자가 나타나지 않습니다.

핵심은 사용자가


http://www.fangbei.org/wxpay/js_api_call.php
로그인 후 복사

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://www.php.cn/
로그인 후 복사
로 점프하는 것입니다. > >

이를 사용하여 코드 매개변수를 얻고, 코드를 기반으로 승인된 access_token 및 openid를 얻습니다. 이 액세스 토큰은 배송 주소 공유 인터페이스에 사용됩니다.

자세한 구현 과정은 WeChat 공개 플랫폼 개발 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
로그인 후 복사

구현 코드는 다음과 같습니다

微信支付开发收货地址共享接口

4. 배송 주소 가져오기

사용자 배송 주소의 editAddress 인터페이스를 편집하고 가져옵니다. 웹 페이지의 프런트 엔드에서 호출하세요.

매개변수 목록:


调用方法如下

微信支付开发收货地址共享接口

参数返回:

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

五、示例

微信支付开发收货地址共享接口 微信支付开发收货地址共享接口 微信支付开发收货地址共享接口 微信支付开发收货地址共享接口 微信支付开发收货地址共享接口

六、完整代码

<?php

/*
    方倍工作室 http://www.fangbei.org/
    CopyRight 2014 All Rights Reserved
*/


define(&#39;APPID&#39;,         "wx—b7559b828e3c13e");
define(&#39;APPSECRET&#39;,     "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(&#39;wxaddr.class.php&#39;);
$weixin = new class_weixin();
$url = &#39;http://&#39;.$_SERVER[&#39;HTTP_HOST&#39;].$_SERVER[&#39;REQUEST_URI&#39;];

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[&#39;access_token&#39;];
}


$timestamp = strval(time());
$noncestr = $weixin->create_noncestr();

$obj[&#39;appId&#39;]               = $weixin->appid;
$obj[&#39;url&#39;]                 = $url;
$obj[&#39;timeStamp&#39;]           = $timestamp;
$obj[&#39;noncestr&#39;]            = $noncestr;
$obj[&#39;accesstoken&#39;]         = $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(&#39;editAddress&#39;,{
                    "appId" : "<?php echo $obj[&#39;appId&#39;];?>",
                    "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>
로그인 후 복사

 更多微信支付开发收货地址共享接口 相关文章请关注PHP中文网!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿