PHP 微信APP支付(TP5)
阿新 • • 發佈:2018-11-28
PHP交流群:294088839
1.進行支付請求 他給的DEMO 用的時候有時候會報錯
1).我遇到的情況 把 WxPay.Api.php這個檔案的 postXmlCurl 這個 方法裡
// curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE); // curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//嚴格校驗 curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
這兩行的嚴格驗證給注掉
2).有時候還會報終端IP錯誤 我的修改方案是 要麼寫死 要麼注掉 他不是必填引數
3)有時候還會報寫入 日誌檔案 包含錯誤 把他的相對路徑改成絕對路徑就好了
4)以下就是APP請求引數
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("購買訂單"); $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 返回值為空 也不報錯 // 然後我發現是因為我用的請求方法為 GetPayUrl() // 這個方法是掃碼支付請求的方法 方法裡有個判斷 $input->GetTrade_type() == "NATIVE" //這個NATIVE 是掃碼支付的型別 // 我就在這個方法裡的if判斷又加了一個if判斷 $input->GetTrade_type() == "APP" //如果他等於APP的時候就讓他再次發下請求 這樣就可以得到引數了 $prepay_id = $result["prepay_id"]; //他所範圍的引數最重要的為 prepay_id 需要再進行引數加密 進入 getOrder()進行加密 $response = $this->getOrder($prepay_id); // correctStatus 此函式是我自定義的 跟APP對接的 json 資料 根據自己的實際情況 定義 $json = correctStatus($response); //最後輸出給 APP 就好了 echo $json;
//執行第二次簽名,才能返回給客戶端使用 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 獲取隨機字串 他寫的demo裡有方法 不過你也可以自定義 $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 這個檔案裡 $s = $this->getSign($data,$wx['web_key']); $data["sign"] = $s; return $data; }
//那些 appid key 什麼的引數配置 我是直接在他的 WxPay.Config.php這個檔案裡寫了個構造方法 直接賦值
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.微信回撥地址的處理
//因為我 在WxPay.Config.php檔案裡已經賦值給了 appid 所以 這邊 new 一下 就會獲取所有的配置引數
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);
//儲存微信的回撥
$objData = $GLOBALS['HTTP_RAW_POST_DATA'];
//自定義日誌 函式
log_result("【接收到的notify通知】:\n".$objData."\n");
$data=\WxPayResults::Init($config,$objData);
// $data = $objData->GetValues();
//TODO 1、進行引數校驗
if(!array_key_exists("return_code", $data) || (array_key_exists("return_code", $data) && $data['return_code'] != "SUCCESS")) {
//TODO失敗,不是支付成功的通知
//如果有需要可以做失敗時候的一些清理處理,並且做一些監控
$msg = "異常異常";
log_result("【接收到的notify通知】:\n".$msg."\n");
return false;
}
if(!array_key_exists("transaction_id", $data)){
$msg = "輸入引數不正確";
log_result("【接收到的notify通知】:\n".$msg."\n");
return false;
}
//這裡可以多一步 引數 具體情況 自己定
//TODO 2、處理業務邏輯
以下就可以寫 業餘邏輯了