1. 程式人生 > >微商城---傻瓜式教你微信支付收貨地址介面開發(PHP)

微商城---傻瓜式教你微信支付收貨地址介面開發(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_basestate則可以隨便填寫。請求這個連結後會跳轉到$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.拼接演算法。

進行加密的欄位有accesstokenappidnoncestrtimestampurl。要進行字典序並且URL鍵值式拼接成字串。(注意,參與簽名的引數的key必須小寫,順序按keyASCII碼從小到大排序。於是如下:

$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彈出的內容


除此之外,如果

是彈出access denied這個東西的話,或者無響應的話。。。那麼你很有可能遇到跟我一樣的問題,這個問題讓我糾結了四天了。。。

就是,你要特別注意一點,收貨地址的頁面跟微信支付一樣都要放在授權目錄!!!只有授權目錄才能調起來,我被坑了四天。。。T T。。。才有了寫這個文章想法來提醒大家。

以下附圖是注意的事項。如果還不行可以看看。


程式碼就到這裡了,一般按流程來,是不會有什麼問題的。相信這篇文章可以讓你更快的理解使用。