微商城---傻瓜式教你微信支付收貨地址介面開發(PHP)
微信中比較好用的介面功能裡,微信收貨地址介面應該算一個,它本身提供了地址的新增刪除使用,可以使微商城省去收貨地址開發的步驟。微支付這個步驟並不難,本身有提供demo給你,稍微改改就能用,看一下概念也清晰了。收貨地址卻沒有。
此文章是以PHP來實現。
在做之前先確定自己有微信公眾平臺的賬號,並且申請了微支付,至少完成了流程前三步。
首先確定一下自己的appId,及appSecret這兩個在微信支付申請成功的郵件或者微信公眾平臺的開發者中心檢視獲得。
一.接下來是文件提及的右側這些引數的獲得。
appId scope signType 這三個就不用說了,相信你們可以理解。
timeStamp 和nonceStr分別可以用PHP的
$timestamp = time();
$noncestr = rand(100000,999999);
比較麻煩的是
addrSign這個引數需要
accesstoken
,
appid
,
noncestr
,
timestamp
及
url進行字典序拼接並且SHA1的加密。我們分一下幾個步驟來就不會出錯了。
1.獲取accesstoken
需要先在公眾平臺後臺-開發者中心-介面許可權表-OAuth2.0網頁授權中設定可以獲取授權的域名
通過以下連結獲取授權 https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=redirect_uri&response_type=code&scope=snsapi_base&state=123#wechat_redirect
程式碼如下:
<a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=redirect_uri&response_type=code&scope=snsapi_base&state=123#wechat_redirect">進入</a>
記住要,替換裡面的APPID,redirect_uri為自己的,redirect_uri是你要回調的地址
$url="http://baidu.com/wechatpay/addr.php"; $info=urlencode($url);
特別注意:scope對應的值必須是snsapi_base,state則可以隨便填寫。請求這個連結後會跳轉到$url這個地址
返回的連結中是帶有code引數的,可以用$_GET獲取。接著
$str=$_GET['code'];
$info="https://api.weixin.qq.com/sns/oauth2/access_token?appid={$appid}&secret={$appsecret}&code={$str}&grant_type=authorization_code";
$data=file_get_contents("$info");
$user_array=json_decode("$data",true);
<span style="white-space:pre"> </span>$accesstoken=$user_array['access_token'];
//通過file_get_contents獲取json然後用json_decode轉為陣列,就可以得到access_token了~在此原諒我英文不好,所以命名方式有點難以理解
2.獲取呼叫介面的頁面的URL
$url="http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
這樣子是最不會出錯了。
3.拼接演算法。
進行加密的欄位有accesstoken,appid,noncestr,timestamp及url。要進行字典序並且URL鍵值式拼接成字串。(注意,參與簽名的引數的key必須小寫,順序按key的ASCII碼從小到大排序。)於是如下:
$data=array("accesstoken"=>"{$accesstoken}","appid"=>"{$appid}","noncestr"=>"{$noncestr}","timestamp"=>"{$timestamp}","url"=>"{$url}");
$signPars = '';
ksort($data);
foreach($data as $k => $v) {
if("" != $v && "sign" != $k) {
if($signPars == '')
$signPars .= $k . "=" . $v;
else
$signPars .= "&". $k . "=" . $v;
}
}
$addrSign = SHA1($signPars);
這樣子就得出 addrSign.接下去第二步了。
二.微信呼叫
必然是呼叫微信的JSAPI的程式碼,這是最關鍵的。細節錯誤一定要注意。
<span style="font-family:Microsoft YaHei;background-color: rgb(153, 255, 153);"><script language="javascript"></span>
<span style="font-family:Microsoft YaHei;"><span style="background-color: rgb(153, 255, 153);">function getaddr(){
WeixinJSBridge.invoke('editAddress',{
</span><span style="background-color: rgb(255, 0, 0);">"appId" : "<?php echo $appid ?>",
"scope" : "jsapi_address",
"signType" : "sha1",
"addrSign" : "<?php echo $addrsign ?>",
"timeStamp" : "<?php echo $timestamp ?>",
"nonceStr" : "<?php echo $noncestr ?>",</span><span style="background-color: rgb(153, 255, 153);">
},function(res){
</span></span>
<span style="font-family:Microsoft YaHei;"><span style="background-color: rgb(153, 255, 153);">//alert(res.err_msg);</span></span>
<span style="font-family:Microsoft YaHei;background-color: rgb(153, 255, 153);">if(res.err_msg == 'edit_address:ok'){
</span>
<span style="font-family:Microsoft YaHei;background-color: rgb(153, 255, 153);">alert("收件人:"+res.userName+" 聯絡電話:"+res.telNumber+" 收貨地址:"+res.proviceFirstStageName+res.addressCitySecondStageName+res.addressCountiesThirdStageName+res.addressDetailInfo+" 郵編:"+res.addressPostalCode);}</span>
<span style="font-family:Microsoft YaHei;background-color: rgb(153, 255, 153);">});}</span>
<span style="font-family:Microsoft YaHei;background-color: rgb(153, 255, 153);"></span><pre name="code" class="html"><input type="submit" class="submit" onclick="getaddr()" value="確定"/>
這一步要注意的是紅色部分這些的引數必須是字串格式。 可用alert測試一下彈出res.err_msg內容。
res.err.msg彈出的內容
除此之外,如果
以下附圖是注意的事項。如果還不行可以看看。
程式碼就到這裡了,一般按流程來,是不會有什麼問題的。相信這篇文章可以讓你更快的理解使用。