本文實(shí)例講述了PHP實(shí)現(xiàn)的微信APP支付功能。分享給大家供大家參考,具體如下:
1.進(jìn)行支付請(qǐng)求 他給的DEMO 用的時(shí)候有時(shí)候會(huì)報(bào)錯(cuò)
1)我遇到的情況 把 WxPay.Api.php這個(gè)文件的 postXmlCurl 這個(gè) 方法里
// curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
// curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//嚴(yán)格校驗(yàn)
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
這兩行的嚴(yán)格驗(yàn)證給注掉
2)有時(shí)候還會(huì)報(bào)終端IP錯(cuò)誤 我的修改方案是 要么寫(xiě)死 要么注掉 他不是必填參數(shù)
3)有時(shí)候還會(huì)報(bào)寫(xiě)入 日志文件 包含錯(cuò)誤 把他的相對(duì)路徑改成絕對(duì)路徑就好了
4)以下就是APP請(qǐng)求參數(shù)
require_once "./payment/wxpay/php/lib/WxPay.Api.php";
require_once "./payment/wxpay/php/example/WxPay.NativePay.php";
$notify = new \NativePay();
$input = new \WxPayUnifiedOrder();
$input->SetBody("購(gòu)買(mǎi)訂單");
$input->SetOut_trade_no($order_data['order_number']);
$input->SetTotal_fee($zongMoney*100);
$input->SetNonce_str($this->createNoncestr());
$input->SetNotify_url(config('u_wx_notify_url'));
$input->SetTrade_type('APP');
$input->SetProduct_id(rand(10000,99999));
$result = $notify->GetPayUrl($input);
//我還遇到了 $result 返回值為空 也不報(bào)錯(cuò)
// 然后我發(fā)現(xiàn)是因?yàn)槲矣玫恼?qǐng)求方法為 GetPayUrl()
// 這個(gè)方法是掃碼支付請(qǐng)求的方法 方法里有個(gè)判斷
$input->GetTrade_type() == "NATIVE"
//這個(gè)NATIVE 是掃碼支付的類(lèi)型
// 我就在這個(gè)方法里的if判斷又加了一個(gè)if判斷
$input->GetTrade_type() == "APP"
//如果他等于A(yíng)PP的時(shí)候就讓他再次發(fā)下請(qǐng)求 這樣就可以得到參數(shù)了
$prepay_id = $result["prepay_id"];
//他所范圍的參數(shù)最重要的為 prepay_id 需要再進(jìn)行參數(shù)加密 進(jìn)入 getOrder()進(jìn)行加密
$response = $this->getOrder($prepay_id);
// correctStatus 此函數(shù)是我自定義的 跟APP對(duì)接的 json 數(shù)據(jù) 根據(jù)自己的實(shí)際情況 定義
$json = correctStatus($response);
//最后輸出給 APP 就好了
echo $json;
//執(zhí)行第二次簽名,才能返回給客戶(hù)端使用
public function getOrder($prepayId){
$pay=\think\Db::name('pay_type')->where(['pay_id'=>2])->field('pay_json')->find();
$wx=json_decode($pay['pay_json'],true);
$data["appid"] = $wx['web_appid'];
//createNoncestr 獲取隨機(jī)字符串 他寫(xiě)的demo里有方法 不過(guò)你也可以自定義
$data["noncestr"] = $this->createNoncestr();
$data["package"] = "Sign=WXPay";
$data["partnerid"] = $wx['web_mch_id'];
$data["prepayid"] = $prepayId;
$data["timestamp"] = time();
// 加密方法 getSign() 同樣的 在他的demo 里也有方法 這些方法都再 WxPay.Data.php 這個(gè)文件里
$s = $this->getSign($data,$wx['web_key']);
$data["sign"] = $s;
return $data;
}
//那些 appid key 什么的參數(shù)配置 我是直接在他的 WxPay.Config.php這個(gè)文件里寫(xiě)了個(gè)構(gòu)造方法 直接賦值
private $appid;
private $mch_id;
private $key;
private $appsecret;
public function __construct()
{
$pay=\think\Db::name('pay_type')->where(['pay_id'=>2])->field('pay_json')->find();
$wx=json_decode($pay['pay_json'],true);
$this->appid=$wx['web_appid'];
$this->mch_id=$wx['web_mch_id'];
$this->key=$wx['web_key'];
$this->appsecret=$wx['web_appsecret'];
}
2.微信回調(diào)地址的處理
//因?yàn)槲?在WxPay.Config.php文件里已經(jīng)賦值給了 appid 所以 這邊 new 一下 就會(huì)獲取所有的配置參數(shù)
require_once "./payment/wxpay/php/lib/WxPay.Api.php";
require_once './payment/wxpay/php/lib/WxPay.Notify.php';
require_once './payment/wxpay/php/lib/WxPay.Data.php';
require_once "./payment/wxpay/php/example/WxPay.Config.php";
$config = new \WxPayConfig();
$notify = new \WxPayNotify();
$notify->Handle($config, false);
//存儲(chǔ)微信的回調(diào)
$objData = $GLOBALS['HTTP_RAW_POST_DATA'];
//自定義日志 函數(shù)
log_result("【接收到的notify通知】:\n".$objData."\n");
$data=\WxPayResults::Init($config,$objData);
// $data = $objData->GetValues();
//TODO 1、進(jìn)行參數(shù)校驗(yàn)
if(!array_key_exists("return_code", $data) || (array_key_exists("return_code", $data) $data['return_code'] != "SUCCESS")) {
//TODO失敗,不是支付成功的通知
//如果有需要可以做失敗時(shí)候的一些清理處理,并且做一些監(jiān)控
$msg = "異常異常";
log_result("【接收到的notify通知】:\n".$msg."\n");
return false;
}
if(!array_key_exists("transaction_id", $data)){
$msg = "輸入?yún)?shù)不正確";
log_result("【接收到的notify通知】:\n".$msg."\n");
return false;
}
//這里可以多一步 參數(shù) 具體情況 自己定
//TODO 2、處理業(yè)務(wù)邏輯
以下就可以寫(xiě) 業(yè)余邏輯了
更多關(guān)于thinkPHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《ThinkPHP入門(mén)教程》、《thinkPHP模板操作技巧總結(jié)》、《ThinkPHP常用方法總結(jié)》、《codeigniter入門(mén)教程》、《CI(CodeIgniter)框架進(jìn)階教程》、《Zend FrameWork框架入門(mén)教程》及《PHP模板技術(shù)總結(jié)》。
希望本文所述對(duì)大家基于ThinkPHP框架的PHP程序設(shè)計(jì)有所幫助。