獲取微信共享收貨地址

前言:代碼比較簡(jiǎn)單,微信的配置太多了,趟了一堆坑

注意事項(xiàng):

1.支付授權(quán)目錄,必須一致,一個(gè)符號(hào)和大小都不能錯(cuò)

image.png

例如前端url是:www.test.net/Address/,那么授權(quán)目錄必須也是www.test.net/Address/,"/"都不能少,
前端框架會(huì)自動(dòng)把"/"去掉,我們折騰半天都是淚啊
2.公眾號(hào)獲取用戶(hù)信息
微信公眾號(hào)->開(kāi)發(fā)->接口權(quán)限->網(wǎng)頁(yè)授權(quán)獲取用戶(hù)基本信息
3.公眾號(hào)設(shè)置
微信公眾號(hào)->設(shè)置->功能設(shè)置(都設(shè)置上)
4.白名單設(shè)置
微信公眾號(hào)->安全中心->IP白名單

1.閱讀文檔

https://pay.weixin.qq.com/wiki/doc/api/external/jsapi.php?chapter=7_8&index=7

2.前端代碼

IOS好像沒(méi)反應(yīng)一樣,哈哈,其實(shí)只是IOS屏蔽了alert彈框,效果還是有的


<!DOCTYPE html>
<html>
<head>
    <title>獲取共享地址</title>
    <meta charset="utf-8" />
    <meta id="viewport" name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1; user-scalable=no;" />
</head>
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script type="text/javascript">
    wx.config({
        debug: true,
        appId: '',
        timestamp: '',
        nonceStr:'',
        signature:'',
        jsApiList: [
        'checkJsApi',
        'openAddress'

    ]
    });
    wx.ready(function () {
    });
    function getaddr() { wx.openAddress({ success: function (res) {
        // 用戶(hù)成功拉出地址
        //alert(JSON.stringify(res));
        document.getElementById("showAddress").innerHTML="收件人:"+res.userName+"  聯(lián)系電話(huà):"+res.telNumber+"  收貨地址:"+res.proviceFirstStageName+res.addressCitySecondStageName+res.addressCountiesThirdStageName+res.addressDetailInfo+"  郵編:"+res.addressPostalCode;
    },
        cancel: function (errMsg) {
            // 用戶(hù)取消拉出地址 //
            alert(errMsg); }}); }
</script>
<body>




<div class="showaddr"  ><a  href="javascript:getaddr();"><strong>點(diǎn)擊設(shè)置收貨地址</strong></a>
</div>
<div id="showAddress"></div>
</body>
</html>

3.后端代碼

調(diào)用方法,

        $JssdkService =new JssdkService($appid,$appsecret,$url);
        $data=$JssdkService->getSignPackage();

服務(wù)類(lèi)JssdkService代碼

<?php
namespace app\weixin\service;

use app\order\service\BaseService;
use Payment\Client\Refund;
use think\exception\HttpException;
use think\Cache;
use think\Config;


class JssdkService extends BaseService
{
    private $appId;
    private $appSecret;
    private $url;

    public function __construct($appId, $appSecret, $url)
    {
        $this->appId = $appId;
        $this->appSecret = $appSecret;
        $this->url = $url;
    }

    public function getSignPackage()
    {
        $jsapiTicket = $this->getJsApiTicket();
        $url = $this->url; //$url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
        $timestamp = time();
        $nonceStr = $this->createNonceStr();

        // 這里參數(shù)的順序要按照 key 值 ASCII 碼升序排序
        $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
        $signature = sha1($string);

        $signPackage = array(
            "appId" => $this->appId,
            "nonceStr" => $nonceStr,
            "timestamp" => $timestamp,
            "url" => $url,
            "signature" => $signature,
            "rawString" => $string
        );

        return $signPackage;
    }

    private function createNonceStr($length = 16)
    {
        $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }

    private function getJsApiTicket()
    {
        // jsapi_ticket 應(yīng)該全局存儲(chǔ)與更新,以下代碼以寫(xiě)入到文件中做示例
        $ticket = Cache::get('weixini_ticket');

        if (empty($ticket)) {
            $accessToken = $this->getAccessToken();
            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
            $res = json_decode($this->httpGet($url));
            $ticket = $res->ticket;
            Cache::set('weixini_ticket', $ticket, 7000);

        }
        return $ticket;
    }

    private function getAccessToken()
    {
        // access_token 應(yīng)該全局存儲(chǔ)與更新,以下代碼以寫(xiě)入到文件中做示例
        $access_token = Cache::get('weixini_AccessToken');
        if (empty($access_token)) {
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
            $res = json_decode($this->httpGet($url));
            $access_token = $res->access_token;

            $res = Cache::set('weixini_AccessToken', $access_token, 7000);

        }

        return $access_token;
    }

    private function httpGet($url)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 500);
        curl_setopt($curl, CURLOPT_URL, $url);
        $res = curl_exec($curl);
        curl_close($curl);
        return $res;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Nodejs獲取微信簽名并使用JSSDK 上一篇我們講了基本的準(zhǔn)備工作,接下來(lái),進(jìn)入實(shí)戰(zhàn),由于樓主我并沒(méi)有備案過(guò)的...
    我是非著名程序猿閱讀 4,411評(píng)論 0 4
  • 微信公眾號(hào)開(kāi)發(fā) ?前面做過(guò) HG 項(xiàng)目的微信端,里面用到微信掃碼、支付、圖片選取、拍照、分享的功能。用到 weix...
    Ghnhxg閱讀 582評(píng)論 1 1
  • 最近接受了一個(gè)新的需求,希望制作一個(gè)基于微信的英語(yǔ)語(yǔ)音評(píng)價(jià)頁(yè)面。即點(diǎn)擊錄音按鈕,用戶(hù)錄音說(shuō)出預(yù)設(shè)的英文,根據(jù)用戶(hù)的...
    ReeCode閱讀 9,409評(píng)論 7 15
  • 微信H5支付 微信內(nèi)部支付(jsapi支付) 微信外部瀏覽器H5支付(MWEB支付) 起源: 為了展示公司價(jià)值為了...
    京京_3c96閱讀 1,375評(píng)論 1 1
  • 今天第一次放假,我放棄和寢室的寶寶們一起逛街,選擇去姐夫小姨家吃飯,姐夫小姨特別熱情,讓我有點(diǎn)家的感覺(jué),突然想...
    佳佳fineyoga閱讀 93評(píng)論 0 0

友情鏈接更多精彩內(nèi)容