php開(kāi)發(fā)微信支付獲取用戶(hù)地址
使用微信獲取地址信息是和微信支付一道申請(qǐng)的,微信支付申請(qǐng)通過(guò),就可以使用該功能。
微信商城中,使用微信支付獲取用戶(hù)的收貨地址,可以省略用戶(hù)輸入地址信息的繁復(fù)流程,提高用戶(hù)體驗(yàn)。
但是可能是因?yàn)闋砍兜接脩?hù)隱私,所以在使用過(guò)程中,需要用戶(hù)自己主動(dòng)選擇使用該功能,并且是通過(guò)點(diǎn)擊的操作,我們才可以獲取到用戶(hù)的收貨地址,這一點(diǎn)是要注意的。
操作流程如下:
1.用戶(hù)打開(kāi)購(gòu)物車(chē)頁(yè)面,點(diǎn)擊結(jié)算,跳轉(zhuǎn)到一個(gè)微信的oauth2的頁(yè)面,地址為:https://open.weixin.qq.com/connect/oauth2/authorize
2.oauth2頁(yè)面將鏈接redirect到結(jié)算頁(yè)面,使用PHP獲取到鏈接中的code參數(shù),經(jīng)過(guò)處理獲取到accessToken值。生成簽名,組裝成數(shù)組參數(shù)傳遞到頁(yè)面。
3.結(jié)算頁(yè)面使用用戶(hù)點(diǎn)擊事件,結(jié)合2中生成的數(shù)組參數(shù)完成獲取地址的功能。這里可以有一個(gè)將獲取到的地址使用ajax記錄到數(shù)據(jù)庫(kù)的功能,那么客戶(hù)下次購(gòu)物的時(shí)候,就不用麻煩了。
詳細(xì)的講下需要注意的幾點(diǎn):
1.跳轉(zhuǎn)到微信oauth2的這個(gè)步驟,在用戶(hù)看來(lái)是沒(méi)有多少差別的,但是在程序這里就有很多的事情要做。首先是oauth2頁(yè)面的參數(shù),其中appid為微信appid,redirect_uri為urlencode后的訂單結(jié)算頁(yè)面的地址,response_type為固定的code,scope為固定的snsapi_base,state在這個(gè)地方可隨意填寫(xiě),還有一個(gè)#wechat_redirect,那么該鏈接的最終樣子為:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=訂單結(jié)算地址&response_type=code&scope=snsapi_base&state=隨意填寫(xiě)#wechat_redirect
2.用戶(hù)訪(fǎng)問(wèn)到該地址,被重新定位到追加了code參數(shù)訂單結(jié)算地址,在此頁(yè)面需要由程序獲取到accessToken,注意該accessToken為獲取用戶(hù)信息的accessToken跟另外一個(gè)和微信交互的access token不是同一個(gè)。
使用GET請(qǐng)求就可以獲取該accessToken,可以使用curl或者是file_get_contents。請(qǐng)求地址為:
這里有一點(diǎn)需要注意,有時(shí)候微信會(huì)抽風(fēng),會(huì)連續(xù)多次請(qǐng)求訂單結(jié)算頁(yè)面,造成accessToken失效,需特殊處理。
這里的簽名生成和微信支付里面的簽名不一樣,這里的要簡(jiǎn)單很多,只是加密一個(gè)字符串,格式為:accesstoken=ACCESSTOKEN&appid=APPID&noncestr=32位隨機(jī)字符串×tamp=時(shí)間戳&url=當(dāng)前頁(yè)面的URL,然后對(duì)該字符串進(jìn)行sha1加密。
在前端頁(yè)面中需要使用一連串的參數(shù)來(lái)實(shí)現(xiàn)獲取地址的功能,分別是appID,scope(默認(rèn)為jsapi_address),signType(默認(rèn)為sha1),addrSign(上面sha1加密后的字符串),timeStamp(同上文的時(shí)間戳),nonceStr(同上文的隨機(jī)字符串)。
3.在前端頁(yè)面,使用下面的js函數(shù)來(lái)完成獲取用戶(hù)地址的操作:
function get_addr() { WeixinJSBridge.invoke('editAddress',{ "appId" : "<?php echo $sign['appId']?>", "scope" : "jsapi_address", "signType" : "sha1", "addrSign" : "<?php echo $sign['addrSign']?>", "timeStamp" : "<?php echo $sign['timeStamp']?>", "nonceStr" : "<?php echo $sign['nonceStr']?>", },function(res){ if(res.err_msg == 'edit_address:ok') { //將地址信息存入數(shù)據(jù)庫(kù) //將地址信息顯示在當(dāng)前頁(yè)面 document.getElementById("address_info").innerHTML="<b>收件人:"+res.userName+"</b> <b>"+res.telNumber+"</b><br /> 收貨地址:"+res.proviceFirstStageName+res.addressCitySecondStageName+res.addressCountiesThirdStageName+res.addressDetailInfo; } else{ alert("獲取地址失敗,請(qǐng)重新點(diǎn)擊"); } }); }
至此,使用微信獲取用戶(hù)共享地址的開(kāi)發(fā)就完畢了。
相關(guān)文章
php實(shí)現(xiàn)在多維數(shù)組中查找特定value的方法
這篇文章主要介紹了php實(shí)現(xiàn)在多維數(shù)組中查找特定value的方法,實(shí)例分析了php實(shí)現(xiàn)多維數(shù)組的遍歷及unset刪除的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07PHP+Mysql基于事務(wù)處理實(shí)現(xiàn)轉(zhuǎn)賬功能的方法
這篇文章主要介紹了PHP+Mysql基于事務(wù)處理實(shí)現(xiàn)轉(zhuǎn)賬功能的方法,實(shí)例分析了mysql事務(wù)處理的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07請(qǐng)離開(kāi)include_once和require_once
盡量使用include, 而不是include_once, 理由是 include_once需要查詢(xún)一遍已加載的文件列表, 確認(rèn)是否存在, 然后再加載2013-07-07php實(shí)現(xiàn)指定字符串中查找子字符串的方法
這篇文章主要介紹了php實(shí)現(xiàn)指定字符串中查找子字符串的方法,涉及php中strpos()函數(shù)查找字符串的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03set_include_path和get_include_path使用及注意事項(xiàng)
set_include_path 設(shè)置默認(rèn)包含路徑,本文將介紹下其的使用方法,及注意事項(xiàng),感興趣的朋友可以了解下,或許對(duì)你學(xué)習(xí)php有所幫助2013-02-02php使用composer常見(jiàn)問(wèn)題及解決辦法
這篇文章主要介紹了php使用composer常見(jiàn)問(wèn)題及解決辦法,對(duì)composer感興趣的同學(xué),可以參考下2021-04-04舉例講解PHP面對(duì)對(duì)象編程的多態(tài)
這篇文章主要介紹了舉例講解PHP面對(duì)對(duì)象編程的多態(tài),是PHP入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08使用Canal實(shí)現(xiàn)PHP應(yīng)用程序與MySQL數(shù)據(jù)庫(kù)的實(shí)時(shí)數(shù)據(jù)同步
Canal是阿里巴巴開(kāi)源的一個(gè)數(shù)據(jù)同步工具,可實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)到其他數(shù)據(jù)源的實(shí)時(shí)同步,PHP應(yīng)用程序中可輕松使用,提高系統(tǒng)的可靠性和實(shí)時(shí)性,提供了豐富的API和文檔支持2023-04-04php jquery 實(shí)現(xiàn)新聞標(biāo)簽分類(lèi)與無(wú)刷新分頁(yè)
php + jquery ui插件 + jquery pager插件 實(shí)現(xiàn)新聞的 標(biāo)簽分類(lèi) + 無(wú)刷新分頁(yè)2009-12-12