溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

利用PHP怎么開發(fā)一個(gè)微信支付功能

發(fā)布時(shí)間:2020-12-19 14:54:57 來源:億速云 閱讀:221 作者:Leah 欄目:開發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)利用PHP怎么開發(fā)一個(gè)微信支付功能,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

下面以PHP語言為例,對(duì)微信支付的開發(fā)流程進(jìn)行一下說明。

1.獲取訂單信息

2.根據(jù)訂單信息和支付相關(guān)的賬號(hào)生成sign,并且生成支付參數(shù)

3.將支付參數(shù)信息POST到微信服務(wù)器,獲取返回信息

4.根據(jù)返回信息生成相應(yīng)的支付代碼(微信內(nèi)部)或是支付二維碼(非微信內(nèi)),完成支付。

下面分步驟的講一下:

1.微信支付中相關(guān)的必須的訂單參數(shù)有三個(gè),分別是:body(商品名或訂單描述),out_trade_no(一般為訂單號(hào))和total_fee(訂單金額,單位“分”,要注意單位問題),在不同的應(yīng)用中,首先要做的就是獲取訂單中的相關(guān)信息,為支付參數(shù)生成做準(zhǔn)備。

2.其他必須的支付參數(shù)有 appid(微信appid),mch_id(申請(qǐng)成功后告知),device_info(web端和微信端該參數(shù)都是統(tǒng)一的,為大寫的”WEB“),trade_type(根據(jù)使用場(chǎng)景不同,該值也是不同的,微信外部為”NATIVE“,微信內(nèi)部為”JSAPI“),nonce_str(32位隨機(jī)字符串),spbill_create_ip(發(fā)起支付的終端IP,即服務(wù)器IP),notify_url(支付回調(diào)地址,微信服務(wù)器通知網(wǎng)站支付完成與否,修改訂單狀態(tài)),sign(簽名),還有一個(gè)需要說明的地方,如果trade_type為JSAPI的話,openid為必填的參數(shù)。

簽名算法是比較容易出錯(cuò)的地方,在于簽名步驟繁瑣,其實(shí)很關(guān)鍵的是,sign不參與簽名

?A:將1、2中提到的除sign外的參數(shù)賦值,放到一個(gè)數(shù)組array里面,按照字典順序排序,其實(shí)就是鍵值按照A—Z的順序進(jìn)行排序。

B:將數(shù)組轉(zhuǎn)換成字符串string,格式為 k1=v1&k2=v2&...kN=vN

C:在此string后加上KEY值(在微信支付商戶后臺(tái)用戶自己設(shè)定的)現(xiàn)在string = k1=v1&k2=v2&...kN=vN&key=KEY。

D:string = md5(string)

E: sign = strtoupper(string)

至此,sign生成完畢。

將sign添加到array數(shù)組里面生成新的數(shù)組。將該數(shù)組轉(zhuǎn)換為XML。至此,微信支付的參數(shù)準(zhǔn)備工作完成。

3.將2中生成的XML,使用POST的方式發(fā)送請(qǐng)求到微信(https://api.mch.weixin.qq.com/pay/unifiedorder),獲取返回的XML信息,將該信息轉(zhuǎn)換成數(shù)組格式方便操作。返回的XML信息如下:

<xml>
 <return_code><![CDATA[SUCCESS]]></return_code>
 <return_msg><![CDATA[OK]]></return_msg>
 <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
 <mch_id><![CDATA[10000100]]></mch_id>
 <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>
 <sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>
 <result_code><![CDATA[SUCCESS]]></result_code>
 <prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
 <trade_type><![CDATA[JSAPI]]></trade_type>
</xml>


如果是trade_type==native支付的話,還會(huì)多一個(gè)參數(shù)code_url,該URL為微信掃碼支付的地址。

4.下面就是支付的過程了。

如果trade_type==native,那么使用一些方式將code_url轉(zhuǎn)換成二維碼,使用微信掃碼就可以了,如果是微信內(nèi)部點(diǎn)擊支付的話,需要調(diào)用微信js-sdk中的相關(guān)東西,這一步中最關(guān)鍵是生成一個(gè)json格式的字符串。

首先要生成轉(zhuǎn)換json字符串的數(shù)組array_jsapi。

A:該數(shù)組的參數(shù)包括:appId,timeStamp,nonceStr,package,signType(默認(rèn)為”MD5“),要注意大小寫和上面的數(shù)組里面是不一樣的。

B:使用該數(shù)組生成paySign參數(shù),簽名方式同上。

C:將paySign參數(shù)追加到array_jsapi數(shù)組中。

D:將該數(shù)組使用json_encode格式化為字符串js_string。

完成上面的工作,就可以在微信內(nèi)部進(jìn)行支付了。

下面為相關(guān)支付的示例代碼:

<script type='text/javascript'>
         function jsApiCall()
     {
      WeixinJSBridge.invoke(
       'getBrandWCPayRequest',
       $js_string,
       function(res){
        WeixinJSBridge.log(res.err_msg);
         if(res.err_msg=='get_brand_wcpay_request:ok')
         {
          alert('支付成功');
         }
         else
         {
          alert('支付失敗');
         }
       }
      );
     }
     function callpay()
     {
      if (typeof WeixinJSBridge == 'undefined'){
       if( document.addEventListener ){
        document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
       }else if (document.attachEvent){
        document.attachEvent('WeixinJSBridgeReady', jsApiCall); 
        document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
       }
      }else{
       jsApiCall();
      }
     }
    </script>

代碼中js_string即為我們生成的字符串。

HTML代碼中調(diào)用callpay()函數(shù)發(fā)起支付。

這樣微信支付的支付工作就完成了。

下面是回調(diào)工作,該功能確保訂單支付成功后,有正確的狀態(tài)顯示給用戶。

支付完成后,微信使用POST請(qǐng)求,將支付結(jié)果反饋給網(wǎng)站服務(wù)器,網(wǎng)站服務(wù)器獲取POST信息,根據(jù)支付成功與否,來確定是否修改訂單信息。

A:將POST參數(shù)中的sign去除,并且記錄下來該值。

B:對(duì)剩余的參數(shù)進(jìn)行簽名

C:將簽名結(jié)果和POST中的sign進(jìn)行比對(duì),相同說明簽名正確,根據(jù)支付結(jié)果修改訂單狀態(tài)。

E:返回XML信息給微信,確保微信知道網(wǎng)站已經(jīng)收到該通知,避免微信再次推送POST,示例如下:

<xml>
 <return_code><![CDATA[SUCCESS]]></return_code>
 <return_msg><![CDATA[OK]]></return_msg>
</xml>

如果失敗,則返回

<xml>
 <return_code><![CDATA[FAIL]]></return_code>
 <return_msg><![CDATA[失敗原因]]></return_msg>
</xml>

上述就是小編為大家分享的利用PHP怎么開發(fā)一個(gè)微信支付功能了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

php
AI