【移動(dòng)應(yīng)用開發(fā)技術(shù)】微信小程序如何實(shí)現(xiàn)支付功能_第1頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】微信小程序如何實(shí)現(xiàn)支付功能_第2頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】微信小程序如何實(shí)現(xiàn)支付功能_第3頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】微信小程序如何實(shí)現(xiàn)支付功能_第4頁
【移動(dòng)應(yīng)用開發(fā)技術(shù)】微信小程序如何實(shí)現(xiàn)支付功能_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

【移動(dòng)應(yīng)用開發(fā)技術(shù)】微信小程序如何實(shí)現(xiàn)支付功能

這篇文章主要為大家展示了“微信小程序如何實(shí)現(xiàn)支付功能”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓在下帶領(lǐng)大家一起研究并學(xué)習(xí)一下“微信小程序如何實(shí)現(xiàn)支付功能”這篇文章吧。開發(fā)前必讀主要流程小程序前端發(fā)送求參請(qǐng)求接受請(qǐng)求封裝“統(tǒng)一下單”獲取package小程序接受“統(tǒng)一下單”獲取的package值帶入wx.requestPayment發(fā)起支付請(qǐng)求準(zhǔn)備工具申請(qǐng)小程序微信支付拿到小程序微信支付的商戶號(hào)及設(shè)置秘鑰注意:小程序就只需要這兩步,如果是web的話還需要設(shè)置支付目錄授權(quán)域名,文檔里面也有寫的:/wik..統(tǒng)一下單官方文檔:/wik.../**

*

統(tǒng)一訂單

*/

public

function

unifiedorder(){

//

以下配置是必填項(xiàng),如有其它需求請(qǐng)自行配置

$config

=

array(

'appid'

=>

'xxxxxxx',//這里是小程序appid

'mch_id'

=>

'xxxxxxx',//商戶ID

'nonce_str'

=>

$this->getNonceStr(),//隨機(jī)字符串

'body'

=>

'這里是測(cè)試

-

測(cè)試',//請(qǐng)按照文檔要求填寫合格名稱

'out_trade_no'

=>

time().$this->getNonceStr(2),//流水單號(hào)

'total_fee'

=>

'20',//金額,分為單位,這里是0.2元

'spbill_create_ip'

=>

'23',//當(dāng)前IP

'notify_url'

=>

'',//請(qǐng)恕我愚昧,我沒搞懂他有什么用

'trade_type'

=>

'JSAPI',//必須填寫JSAPI

'openid'

=>

'xxxxxxxx'//當(dāng)前用戶的openid,在trade_type=JSAPI的時(shí)候,此項(xiàng)就變成必填項(xiàng)了

);

$config['sign']

=

$this->getSignPay($config);

$xmlData

=

$this->ToXml($config);//轉(zhuǎn)成xml數(shù)據(jù)

$postData

=

$this->http_post($xmlData);

$arrayData

=

$this->FromXml($postData);

if($arrayData['return_code']

==

'SUCCESS'

||

$arrayData['result_code']

==

'SUCCESS'){

return

$arrayData['prepay_id'];//重點(diǎn)來了:走了這么多路,就為了這個(gè)值。到這一步就證明成功一多半了。

}else{

return

$arrayData;//返回錯(cuò)誤

}

}

/**

*

獲取簽名

*/

public

function

getSignPay($config){

$key

=

'xxxxxxx';//商戶秘鑰,就是自己生成的32位密碼

$strA

=

'appid='.$config['appid'].'&body='.$config['body'].'&mch_id='.$config['mch_id'].'&nonce_str='.$config['nonce_str'].'¬ify_url='.$config['notify_url'].'&spbill_create_ip'.$config['spbill_create_ip'].'&total_fee='.$config['total_fee'].'&trade_type='.$config['trade_type'];//ASCII

字典序

$strB

=

$strA.'&key='.$key;

$sign

=

strtoupper(md5($strB));//大寫MD5

return

$sign;

}

/**

*

隨機(jī)字符串

32位

*/

public

function

getNonceStr($length

=

32){

$chars

=

"abcdefghijklmnopqrstuvwxyz0123456789";

$str

="";

for

(

$i

=

0;

$i

<

$length;

$i++

)

{

$str

.=

substr($chars,

mt_rand(0,

strlen($chars)-1),

1);

}

return

$str;

}

/**

*

array轉(zhuǎn)XML

*/

public

function

ToXml($data){

if(!is_array($data)

||

count($data)

<=

0){

throw

new

WxPayException("數(shù)組數(shù)據(jù)異常!");

}

$xml

=

"<xml>";

foreach

($data

as

$key=>$val){

$xml.="<".$key.">".$val."</".$key.">";

}

$xml.="</xml>";

return

$xml;

}

/**

*

xml轉(zhuǎn)array

*/

public

function

FromXml($xml){

if(!$xml){

throw

new

WxPayException("xml數(shù)據(jù)異常!");

}

libxml_disable_entity_loader(true);

$this->values

=

json_decode(json_encode(simplexml_load_string($xml,

'SimpleXMLElement',

LIBXML_NOCDATA)),

true);

return

$this->values;

}

/**

*

post

請(qǐng)求

*/

public

function

http_post($url,$param,$post_file=false){

$oCurl

=

curl_init();

if(stripos($url,"https://")!==FALSE){

curl_setopt($oCurl,

CURLOPT_SSL_VERIFYPEER,

FALSE);

curl_setopt($oCurl,

CURLOPT_SSL_VERIFYHOST,

false);

curl_setopt($oCurl,

CURLOPT_SSLVERSION,

1);

//CURL_SSLVERSION_TLSv1

}

if

(PHP_VERSION_ID

>=

50500

&&

class_exists('\CURLFile'))

{

$is_curlFile

=

true;

}

else

{

$is_curlFile

=

false;

if

(defined('CURLOPT_SAFE_UPLOAD'))

{

curl_setopt($oCurl,

CURLOPT_SAFE_UPLOAD,

false);

}

}

if

(is_string($param))

{

$strPOST

=

$param;

}elseif($post_file)

{

if($is_curlFile)

{

foreach

($param

as

$key

=>

$val)

{

if

(substr($val,

0,

1)

==

'@')

{

}

}

}

$strPOST

=

$param;

}

else

{

$aPOST

=

array();

foreach($param

as

$key=>$val){

$aPOST[]

=

$key."=".urlencode($val);

}

$strPOST

=

join("&",

$aPOST);

}

curl_setopt($oCurl,

CURLOPT_URL,

$url);

curl_setopt($oCurl,

CURLOPT_RETURNTRANSFER,

1

);

curl_setopt($oCurl,

CURLOPT_POST,true);

curl_setopt($oCurl,

CURLOPT_POSTFIELDS,$strPOST);

$sContent

=

curl_exec($oCurl);

$aStatus

=

curl_getinfo($oCurl);

curl_close($oCurl);

if(intval($aStatus["http_code"])==200){

return

$sContent;

}else{

return

false;

}

}好了現(xiàn)在已經(jīng)獲取到了prepay_id的值,我們的統(tǒng)一下單就算完成了,其實(shí)我更樂意叫他數(shù)據(jù)封小程序微信支付官方文檔:https://developers.weixin.qq先來一個(gè)插曲,首先我們小程序的前端需要去觸發(fā)pay,實(shí)現(xiàn)的功能肯定是要點(diǎn)擊小程序的一個(gè)觸發(fā),然后才能支付對(duì)吧,pay:function(e){

//這里面使用post去請(qǐng)求。然后通過我接下來要寫的API支付代碼獲取小程序支付參數(shù)

success:function(res){

wx.requestPayment({

'timeStamp':toString(res.timeStamp),//這里轉(zhuǎn)字符串,這里被坑過,不轉(zhuǎn)的話可能會(huì)出現(xiàn)total_fee為空

'nonceStr':toString(res.nonceStr),

'package':toString(res.package),

'signType':'MD5',

'paySign':toString(res.paySign),

success:function(res){

console.log(res);//這里可以跳轉(zhuǎn)到帶參地址

},

fail:function(res){

('支付失敗',res);

},

complete:function(){

('支付觸發(fā)回調(diào)',res);

}

})

}

}api支付也就是上面小程序代碼的后端請(qǐng)求地址/**

*

api組裝數(shù)據(jù)

*/

public

function

payApiBlack(){

$appid

=

'xxxxxx';//小程序appid,上面有重復(fù),不過這樣比較直觀

$timeStamp

=

time();

$nonceStr

=

$this->getNonceStr();//這是調(diào)用統(tǒng)一下單里面的方法,為了直觀,我把這些代碼都寫在了一個(gè)類里

$package

=

'prepay_id='.$this->unifiedorder();

$signType

=

'MD5';

$key

=

'xxxxxx';//這里是商戶秘鑰,32位,同上面也有

$strA

=

'appId='.$appid.'&nonceStr=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論