微信支付開發(fā)(7) 收貨地址共享接口V2,v2_PHP教程
Jul 12, 2016 am 08:53 AM微信支付開發(fā)(7) 收貨地址共享接口V2,v2
關(guān)鍵字:微信公眾平臺(tái) JSSDK 發(fā)送給朋友 收貨地址共享接口?openAddress?
作者:方倍工作室?
原文:http://www.cnblogs.com/txw1958/p/weixin-openaddress.html
?
在這篇微信公眾平臺(tái)開發(fā)教程中,我們將介紹如何在網(wǎng)頁(yè)中實(shí)現(xiàn)獲取收貨地址的功能。
收貨地址共享接口 在2016年4月13日 進(jìn)行過(guò)升級(jí),2016年5月20日只能使用新接口,本教程為新版接口的教程!
本文分為以下二個(gè)部分:
?
?
一、微信JS-SDK
1. 獲得Access Token
access token的獲得方法在前面有介紹,詳情見?微信公眾平臺(tái)開發(fā)(26) ACCESS TOKEN
2. 獲取jsapi_ticket
生成簽名之前必須先了解一下jsapi_ticket,jsapi_ticket是公眾號(hào)用于調(diào)用微信JS接口的臨時(shí)票據(jù)。正常情況下,jsapi_ticket的有效期為7200秒,通過(guò)access_token來(lái)獲取。由于獲取jsapi_ticket的api調(diào)用次數(shù)非常有限,頻繁刷新jsapi_ticket會(huì)導(dǎo)致api調(diào)用受限,影響自身業(yè)務(wù),開發(fā)者必須在自己的服務(wù)全局緩存jsapi_ticket 。
參考以下文檔獲取access_token(有效期7200秒,開發(fā)者必須在自己的服務(wù)全局緩存access_token):
用第一步拿到的access_token 采用http GET方式請(qǐng)求獲得jsapi_ticket(有效期7200秒,開發(fā)者必須在自己的服務(wù)全局緩存jsapi_ticket),接口地址如下
https:<span>//</span><span>api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi</span>
成功返回如下JSON:
<span>{ </span><span>"</span><span>errcode</span><span>"</span>:<span>0</span><span>, </span><span>"</span><span>errmsg</span><span>"</span>:<span>"</span><span>ok</span><span>"</span><span>, </span><span>"</span><span>ticket</span><span>"</span>:<span>"</span><span>bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA</span><span>"</span><span>, </span><span>"</span><span>expires_in</span><span>"</span>:<span>7200</span><span> }</span>
獲得jsapi_ticket之后,就可以生成JS-SDK權(quán)限驗(yàn)證的簽名了。
3. 簽名算法實(shí)現(xiàn)
簽名生成規(guī)則如下:參與簽名的字段包括noncestr(隨機(jī)字符串), 有效的jsapi_ticket, timestamp(時(shí)間戳), url(當(dāng)前網(wǎng)頁(yè)的URL,不包含#及其后面部分) 。對(duì)所有待簽名參數(shù)按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對(duì)的格式(即key1=value1&key2=value2…)拼接成字符串string1。這里需要注意的是所有參數(shù)名均為小寫字符。對(duì)string1作sha1加密,字段名和字段值都采用原始值,不進(jìn)行URL 轉(zhuǎn)義。
即signature=sha1(string1)。 示例:
noncestr=<span>Wm3WZYTPz0wzccnW jsapi_ticket</span>=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-<span>HhTdfl2fzFy1AOcHKP7qg timestamp</span>=<span>1414587457</span><span> url</span>=http:<span>//</span><span>mp.weixin.qq.com?params=value</span>
步驟1. 對(duì)所有待簽名參數(shù)按照字段名的ASCII 碼從小到大排序(字典序)后,使用URL鍵值對(duì)的格式(即key1=value1&key2=value2…)拼接成字符串string1:
jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp=<span>1414587457</span>&url=http:<span>//</span><span>mp.weixin.qq.com?params=value</span>
步驟2. 對(duì)string1進(jìn)行sha1簽名,得到signature:
0f9de62fce790f9a083d5c99e95740ceb90c27ed
完整代碼如下
<?<span>php </span><span>class</span><span> JSSDK { </span><span>private</span> <span>$appId</span><span>; </span><span>private</span> <span>$appSecret</span><span>; </span><span>public</span> <span>function</span> __construct(<span>$appId</span>, <span>$appSecret</span><span>) { </span><span>$this</span>->appId = <span>$appId</span><span>; </span><span>$this</span>->appSecret = <span>$appSecret</span><span>; } </span><span>public</span> <span>function</span><span> getSignPackage() { </span><span>$jsapiTicket</span> = <span>$this</span>-><span>getJsApiTicket(); </span><span>//</span><span> 注意 URL 一定要?jiǎng)討B(tài)獲取,不能 hardcode.</span> <span>$protocol</span> = (!<span>empty</span>(<span>$_SERVER</span>['HTTPS']) && <span>$_SERVER</span>['HTTPS'] !== 'off' || <span>$_SERVER</span>['SERVER_PORT'] == 443) ? "https://" : "http://"<span>; </span><span>$url</span> = "<span>$protocol$_SERVER</span>[HTTP_HOST]<span>$_SERVER</span>[REQUEST_URI]"<span>; </span><span>$timestamp</span> = <span>time</span><span>(); </span><span>$nonceStr</span> = <span>$this</span>-><span>createNonceStr(); </span><span>//</span><span> 這里參數(shù)的順序要按照 key 值 ASCII 碼升序排序</span> <span>$string</span> = "jsapi_ticket=<span>$jsapiTicket</span>&noncestr=<span>$nonceStr</span>×tamp=<span>$timestamp</span>&url=<span>$url</span>"<span>; </span><span>$signature</span> = <span>sha1</span>(<span>$string</span><span>); </span><span>$signPackage</span> = <span>array</span><span>( </span>"appId" => <span>$this</span>->appId, "nonceStr" => <span>$nonceStr</span>, "timestamp" => <span>$timestamp</span>, "url" => <span>$url</span>, "signature" => <span>$signature</span>, "rawString" => <span>$string</span><span> ); </span><span>return</span> <span>$signPackage</span><span>; } </span><span>private</span> <span>function</span> createNonceStr(<span>$length</span> = 16<span>) { </span><span>$chars</span> = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"<span>; </span><span>$str</span> = ""<span>; </span><span>for</span> (<span>$i</span> = 0; <span>$i</span> < <span>$length</span>; <span>$i</span>++<span>) { </span><span>$str</span> .= <span>substr</span>(<span>$chars</span>, <span>mt_rand</span>(0, <span>strlen</span>(<span>$chars</span>) - 1), 1<span>); } </span><span>return</span> <span>$str</span><span>; } </span><span>private</span> <span>function</span><span> getJsApiTicket() { </span><span>//</span><span> jsapi_ticket 應(yīng)該全局存儲(chǔ)與更新,以下代碼以寫入到文件中做示例</span> <span>$data</span> = json_decode(<span>file_get_contents</span>("jsapi_ticket.json"<span>)); </span><span>if</span> (<span>$data</span>->expire_time < <span>time</span><span>()) { </span><span>$accessToken</span> = <span>$this</span>-><span>getAccessToken(); </span><span>//</span><span> 如果是企業(yè)號(hào)用以下 URL 獲取 ticket // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";</span> <span>$url</span> = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=<span>$accessToken</span>"<span>; </span><span>$res</span> = json_decode(<span>$this</span>->httpGet(<span>$url</span><span>)); </span><span>$ticket</span> = <span>$res</span>-><span>ticket; </span><span>if</span> (<span>$ticket</span><span>) { </span><span>$data</span>->expire_time = <span>time</span>() + 7000<span>; </span><span>$data</span>->jsapi_ticket = <span>$ticket</span><span>; </span><span>$fp</span> = <span>fopen</span>("jsapi_ticket.json", "w"<span>); </span><span>fwrite</span>(<span>$fp</span>, json_encode(<span>$data</span><span>)); </span><span>fclose</span>(<span>$fp</span><span>); } } </span><span>else</span><span> { </span><span>$ticket</span> = <span>$data</span>-><span>jsapi_ticket; } </span><span>return</span> <span>$ticket</span><span>; } </span><span>private</span> <span>function</span><span> getAccessToken() { </span><span>//</span><span> access_token 應(yīng)該全局存儲(chǔ)與更新,以下代碼以寫入到文件中做示例</span> <span>$data</span> = json_decode(<span>file_get_contents</span>("access_token.json"<span>)); </span><span>if</span> (<span>$data</span>->expire_time < <span>time</span><span>()) { </span><span>//</span><span> 如果是企業(yè)號(hào)用以下URL獲取access_token // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";</span> <span>$url</span> = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=<span>$this</span>->appId&secret=<span>$this</span>->appSecret"<span>; </span><span>$res</span> = json_decode(<span>$this</span>->httpGet(<span>$url</span><span>)); </span><span>$access_token</span> = <span>$res</span>-><span>access_token; </span><span>if</span> (<span>$access_token</span><span>) { </span><span>$data</span>->expire_time = <span>time</span>() + 7000<span>; </span><span>$data</span>->access_token = <span>$access_token</span><span>; </span><span>$fp</span> = <span>fopen</span>("access_token.json", "w"<span>); </span><span>fwrite</span>(<span>$fp</span>, json_encode(<span>$data</span><span>)); </span><span>fclose</span>(<span>$fp</span><span>); } } </span><span>else</span><span> { </span><span>$access_token</span> = <span>$data</span>-><span>access_token; } </span><span>return</span> <span>$access_token</span><span>; } </span><span>private</span> <span>function</span> httpGet(<span>$url</span><span>) { </span><span>$curl</span> =<span> curl_init(); curl_setopt(</span><span>$curl</span>, CURLOPT_RETURNTRANSFER, <span>true</span><span>); curl_setopt(</span><span>$curl</span>, CURLOPT_TIMEOUT, 500<span>); curl_setopt(</span><span>$curl</span>, CURLOPT_SSL_VERIFYPEER, <span>false</span><span>); curl_setopt(</span><span>$curl</span>, CURLOPT_SSL_VERIFYHOST, <span>false</span><span>); curl_setopt(</span><span>$curl</span>, CURLOPT_URL, <span>$url</span><span>); </span><span>$res</span> = curl_exec(<span>$curl</span><span>); curl_close(</span><span>$curl</span><span>); </span><span>return</span> <span>$res</span><span>; } }</span>
二、收貨地址共享接口
一. 簡(jiǎn)介
微信收貨地址共享,是指用戶在微信瀏覽器內(nèi)打開網(wǎng)頁(yè),填寫過(guò)地址后,后續(xù)可以免填寫支持快速選擇,也可增加和編輯。此地址為用戶屬性,可在各商戶的網(wǎng)頁(yè)中共享使用。支持原生控件填寫地址,地址數(shù)據(jù)會(huì)傳遞到商戶。
地址共享是基于微信JavaScript API 實(shí)現(xiàn),只能在微信內(nèi)置瀏覽器中使用,其他瀏覽器調(diào)用無(wú)效。同時(shí),需要微信5.0 版本才能支持,建議通過(guò)user agent 來(lái)確定用戶當(dāng)前的版本號(hào)后再調(diào)用地址接口。以iPhone 版本為例,可以通過(guò)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 為用戶安裝的微信版本號(hào),商戶可以判定版本號(hào)是否高于或者等于5.0。
地址格式
微信地址共享使用的數(shù)據(jù)字段包括:
- 收貨人姓名
- 地區(qū),省市區(qū)三級(jí)
- 詳細(xì)地址
- 郵編
- 聯(lián)系電話
其中,地區(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
2. 綁定域名
先登錄微信公眾平臺(tái)進(jìn)入“公眾號(hào)設(shè)置”的“功能設(shè)置”里填寫“JS接口安全域名”。
3. 獲取簽名包
<?<span>php </span><span>require_once</span> "jssdk.php"<span>; </span><span>$jssdk</span> = <span>new</span> JSSDK("yourAppID", "yourAppSecret"<span>); </span><span>$signPackage</span> = <span>$jssdk</span>-><span>GetSignPackage(); </span>?>
4. 引入JS文件
在需要調(diào)用JS接口的頁(yè)面引入如下JS文件:
特別注意:JS-SDK版本需使用http://res.wx.qq.com/open/js/jweixin-1.1.0.js
<span><</span><span>script </span><span>src</span><span>="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"</span><span>></</span><span>script</span><span>></span>
5.通過(guò)config接口注入權(quán)限驗(yàn)證配置
所有需要使用JS-SDK的頁(yè)面必須先注入配置信息,否則將無(wú)法調(diào)用。
<script><span> wx.config({ debug: </span><span>false</span><span>, appId: </span>'<?php echo $signPackage["appId"];?>'<span>, timestamp: </span><?php echo $signPackage["timestamp"];?><span>, nonceStr: </span>'<?php echo $signPackage["nonceStr"];?>'<span>, signature: </span>'<?php echo $signPackage["signature"];?>'<span>, jsApiList: [ </span><span>//</span><span> 所有要調(diào)用的 API 都要加到這個(gè)列表中</span> 'checkJsApi'<span>, </span>'openAddress'<span>, ] }); </span></script>
5. 通過(guò)ready接口處理成功驗(yàn)證
需要在頁(yè)面加載時(shí)就調(diào)用,需要把相關(guān)接口放在ready函數(shù)中調(diào)用來(lái)確保正確執(zhí)行
wx.ready(<span>function</span><span> () { });</span>
5.1 通過(guò)checkJsApi判斷當(dāng)前客戶端版本是否支持分享參數(shù)自定義
<span> wx.checkJsApi({ jsApiList: [ </span>'openAddress'<span>, ], success: </span><span>function</span><span> (res) { alert(JSON.stringify(res)); } });</span>
5.3. 實(shí)現(xiàn)收貨地址共享
<span> wx.openAddress({ trigger: </span><span>function</span><span> (res) { alert(</span>'用戶開始拉出地址'<span>); }, success: </span><span>function</span><span> (res) { alert(</span>'用戶成功拉出地址'<span>); alert(JSON.stringify(res)); document.form1.address1.value </span>=<span> res.provinceName; document.form1.address2.value </span>=<span> res.cityName; document.form1.address3.value </span>=<span> res.countryName; document.form1.detail.value </span>=<span> res.detailInfo; document.form1.national.value </span>=<span> res.nationalCode; document.form1.user.value </span>=<span> res.userName; document.form1.phone.value </span>=<span> res.telNumber; document.form1.postcode.value </span>=<span> res.postalCode; document.form1.errmsg.value </span>=<span> res.errMsg; document.form1.qq.value </span>= 1354386063<span>; }, cancel: </span><span>function</span><span> (res) { alert(</span>'用戶取消拉出地址'<span>); }, fail: </span><span>function</span><span> (res) { alert(JSON.stringify(res)); } });</span>
?
返回說(shuō)明
返回值 |
說(shuō)明 |
---|---|
errMsg |
獲取編輯收貨地址成功返回“openAddress:ok”。 |
userName |
收貨人姓名。 |
postalCode |
郵編。 |
provinceName |
國(guó)標(biāo)收貨地址第一級(jí)地址(?。?。 |
cityName |
國(guó)標(biāo)收貨地址第二級(jí)地址(市)。 |
countryName |
國(guó)標(biāo)收貨地址第三級(jí)地址(國(guó)家)。 |
detailInfo |
詳細(xì)收貨地址信息。 |
nationalCode |
收貨地址國(guó)家碼。 |
?
三、實(shí)現(xiàn)效果
?
?
?
?
?

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Komik menyalin tidak diragukan lagi sebagai harta yang tidak dapat dilepaskan. Di sini anda boleh menemui komik bola keranjang dalam pelbagai gaya, dari cerita kompetitif yang bersemangat dan inspirasi untuk komedi harian yang santai dan lucu. Sama ada anda ingin menghidupkan semula klasik atau menemui karya baru, menyalin komik dapat memenuhi keperluan anda. Melalui portal bacaan dalam talian yang disediakan oleh Copy Comics, anda akan mengucapkan selamat tinggal kepada masalah sumber cetak rompak, menikmati pengalaman membaca yang tinggi dan lancar, dan dapat menyokong pengarang komik kegemaran anda dan menyumbang kepada pembangunan komik yang sahih.

Menggabungkan trend industri terkini dan data penilaian pelbagai dimensi pada tahun 2025, yang berikut adalah cadangan perisian penulisan AI yang komprehensif, yang meliputi senario arus perdana seperti penciptaan umum, penyelidikan akademik, dan pemasaran komersial, sambil mengambil kira perkhidmatan pengoptimuman dan penyetempatan Cina:

Komik yang bagus, platform pengalaman membaca yang mendalam yang didedikasikan untuk mencipta pencinta komik, menyatukan sejumlah besar sumber komik berkualiti tinggi di rumah dan di luar negara. Ia bukan sahaja platform membaca komik, tetapi juga komuniti yang menghubungkan artis komik dan pembaca dan berkongsi budaya komik. Melalui reka bentuk antara muka yang mudah dan intuitif dan fungsi carian yang kuat, NES Comics membolehkan anda dengan mudah mencari karya kegemaran anda dan menikmati pengalaman membaca yang lancar dan selesa. Katakan selamat tinggal kepada operasi yang lama menunggu dan membosankan, masukkan dunia komik yang bagus dengan serta -merta dan mulakan perjalanan komik anda!

Komik Frogman telah menjadi pilihan pertama bagi banyak pencinta komik dengan sumber komik yang kaya dan pelbagai dan pengalaman membaca dalam talian yang mudah dan lancar. Ia seperti kolam yang bersemangat, dengan cerita -cerita segar dan menarik yang sentiasa muncul, menunggu anda menemui dan meneroka. Frog Man Comics meliputi pelbagai subjek, dari pengembaraan yang ghairah hingga cinta manis, dari fantasi dan fiksyen sains untuk penangguhan yang menggembirakan, tidak kira genre yang anda suka, anda dapat mencari karya kegemaran anda di sini. Reka bentuk antara muka yang mudah dan intuitif membolehkan anda dengan mudah memulakan, dengan cepat mencari komik yang anda ingin baca, dan tenggelamkan diri anda dalam dunia komik yang menarik.

Di sini, anda boleh menikmati lautan komik yang luas dan meneroka karya-karya pelbagai tema dan gaya, dari komik lelaki muda yang ghairah hingga komik gadis yang halus dan bergerak, dari komik misteri yang membosankan dan membakar otak untuk komik harian yang santai dan lucu, ada segala-galanya, dan selalu ada yang dapat menyentuh hati anda. Kami bukan sahaja mempunyai sejumlah besar sumber komik yang tulen, tetapi juga sentiasa memperkenalkan dan mengemas kini kerja -kerja terkini untuk memastikan bahawa anda dapat membaca komik kegemaran anda secepat mungkin.

Pengguna telefon bimbit Android boleh memuat turun dan memasang aplikasi Huobi/Huobi melalui langkah -langkah berikut: 1. Pastikan rangkaian stabil dan ruang penyimpanan mencukupi; 2. Muat turun aplikasi melalui laman web rasmi Huobi/Huobi, gunakan penyemak imbas untuk mengakses laman web rasmi dan klik pautan muat turun atau mengimbas kod QR, atau cari dan muat turun melalui kedai aplikasi pihak ketiga seperti Apptreasure dan Huawei App Market, dan anda juga boleh mendapatkan pakej pemasangan melalui perkongsian rakan-rakan; 3. Cari fail .apk yang dimuat turun, aktifkan kebenaran pemasangan "Sumber Sumber Tidak Diketahui", ikuti arahan untuk menyelesaikan pemasangan, dan lain -lain.

Ya, tetapi ada sekatan. ① Anda boleh log masuk ke akaun yang sama pada kedua -dua telefon iPhone dan Android, tetapi log masuk ke peranti terkini akan menyebabkan sesi terawal menjadi luar talian; ② Anda boleh log masuk pada masa yang sama pada telefon bimbit dan desktop komputer, tetapi fungsi tidak disegerakkan; ③ Walaupun menggunakan alat pihak ketiga atau fungsi dwi-apl boleh membolehkan pembalakan di antara dua telefon bimbit, ia tidak disokong secara tidak rasmi dan boleh melanggar peraturan; ④ Penyelesaian alternatif termasuk menggunakan versi Web/Desktop untuk memadankan telefon utama, atau memindahkan rekod sembang melalui sandaran awan dan alat fail. Sesetengah mesin Android juga boleh menggunakan "aplikasi dwi" untuk menjalankan dua contoh akaun.

Untuk selamat mencari portal log masuk versi web rasmi OUYI, anda mesti terlebih dahulu mendapatkan maklumat melalui saluran rasmi dan mengesahkan silang dengan alat penyemak imbas untuk pengesahan nama domain. Pengguna harus mendapatkan maklumat masuk dari pengumuman rasmi, akaun media sosial dan arahan dalam aplikasi.
