1. 程式人生 > >PHP 微信APP支付(TP5)

PHP 微信APP支付(TP5)

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、處理業務邏輯
  以下就可以寫 業餘邏輯了