1. 程式人生 > >ThinkPHP5微信手機支付

ThinkPHP5微信手機支付

  1. 下載demo放置在vendor目錄下在這裡插入圖片描述 在這裡插入圖片描述
  2. 配置好config在這裡插入圖片描述
  3. 微信商戶平臺配置到支付目錄(一定是目錄,不是方法)

js調起支付方法

 //呼叫微信JS api 支付
  function jsApiCall()
  {
    var item_id = {$payinfo['item_id']};
    var data={$data};
    WeixinJSBridge.invoke(
      'getBrandWCPayRequest', data, 
      function(res){
        WeixinJSBridge.log(res.err_msg); 
          if(res.err_msg == "get_brand_wcpay_request:ok"){  
            alert("支付成功!");
           window.location.href="";//支付成功,發貨處理方法
          }else if(res.err_msg == "get_brand_wcpay_request:cancel"){  
            alert("使用者取消支付!");
            window.location.href="";  //支付取消處理方法
          }else{  
            alert("支付失敗!");  
           window.location.href="";//支付失敗處理方法
          }  
      }
    );
  }
 
  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();
    }
  }

PHP支付類

<?php 
namespace app\*\controller;

use think\Controller; 
use think\Session;  

use app\*\model\ConfigCommodityInfo;  
use app\*\model\RecordOrder;  

class Pay extends Controller

{
    public function _initialize()
    {
        parent::_initialize();  
        $this->info = new ConfigCommodityInfo();  
        $this->order = new RecordOrder();   
    } 
   
    //統一下單 調取微信支付介面 
    public function pay($item_id,$order_sn,$openid)
    { 
        vendor('pay.WxPayApi') ; 
        vendor('pay.WxPayJsApiPay'); 
        $tools = new \JsApiPay();
        $order = new \WxPayApi();
         
        $appid = '*'; 
        $payinfo = $this->info->selCommodityInfoId($item_id);
  
        define("PARTERKEY",$payinfo['item_id']); 
        $input = new \WxPayUnifiedOrder(); 
        $input->SetBody($payinfo['item_title']);                    //商品名稱
        $input->SetAttach('$attach');                 //附加引數,可填可不填,填寫的話,裡邊字串不能出現空格
        $input->SetOut_trade_no($order_sn);         //訂單號
        $input->SetTotal_fee($payinfo['unit_price'] *100);           //支付金額,單位:分換成元*100
        $input->SetTime_start(date("YmdHis", time() ));      //支付發起時間
        $input->SetTime_expire(date("YmdHis", time() + 6000));//支付超時
        $input->SetGoods_tag("test3");
        
        $input->SetNotify_url("/agent/coupon/notify");
        $input->SetTrade_type("JSAPI");             //支付型別
        $input->SetOpenid($openid);                 //使用者openID
        $input->SetAppid($appid);
     
        $order = $order->unifiedOrder($input);    //統一下單 
        $jsApiParameters = $tools->GetJsApiParameters($order);
        return $jsApiParameters;
    }


    public function imstr($field){
        $str = '';
        foreach ($field as $key) {
            $str .= "`v`."."`".$key."`,";
        }
        return trim($str,',');
    }

    //微信支付回撥驗證
    public function notify(){
        $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
        $data = xmlToArray($xml);
        // 儲存微信伺服器返回的簽名sign
        $data_sign = $data['sign'];
        // sign不參與簽名演算法
        unset($data['sign']);
        $sign = $this->makeSign($data);
        
        // 判斷簽名是否正確  判斷支付狀態
        if ( ($sign===$data_sign) && ($data['return_code']=='SUCCESS') && ($data['result_code']=='SUCCESS') ) {
            $result = $data; 
            file_put_contents('./Api/wxpay/logs/log1.txt',$xml,FILE_APPEND); 
            //獲取伺服器返回的資料
            $order_sn = $data['out_trade_no'];  //訂單單號
            $order_id = $data['attach'];        //附加引數,選擇傳遞訂單ID 
            $openid = $data['openid'];          //付款人openID
            $total_fee = $data['total_fee'];    //付款金額 
            //更新資料庫
            $this->updateDB($order_id,$order_sn,$openid,$total_fee);
        }else{
            $result = false;
        }
        // 返回狀態給微信伺服器
        if ($result) {
            $str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
        }else{
            $str='<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[簽名失敗]]></return_msg></xml>';
        }
        echo $str;
        return $result;
    }
    /**
    * 生成簽名
    * @return 簽名,本函式不覆蓋sign成員變數
    */
    protected function makeSign($data){
        //獲取微信支付祕鑰
        vendor('pay.WxPayApi') ;
        $key = \WxPayConfig::KEY;
        // 去空
        $data=array_filter($data);
        //簽名步驟一:按字典序排序引數
        ksort($data);
        $string_a=http_build_query($data);
        $string_a=urldecode($string_a);
        //簽名步驟二:在string後加入KEY
        //$config=$this->config;
        $string_sign_temp=$string_a."&key=".$key;
        //簽名步驟三:MD5加密
        $sign = md5($string_sign_temp);
        // 簽名步驟四:所有字元轉為大寫
        $result=strtoupper($sign);
        return $result;
    }
}
//資料庫訂單生成一級微信訂單生成
public function buy_order()
{

	$item_id = input('item_id');
	$payinfo = $this->info->selCommodityInfoId($item_id);
	$payinfo['order_create_time'] = date('Y-m-d H:i:s',time()) ;
	$order_sn = time() . rand(1000,9999);
	$payinfo['order_id'] = $order_sn; 
   $openid = Session::get('front_pay_openid'); 

	$res['order_id'] = $order_sn;
    $res['goods_id'] = $payinfo['item_id'];
    $res['user_id'] = Session::get('user_id');
    $res['goods_total_price'] = $payinfo['unit_price'];
    $res['order_create_time'] = time().'000';
    $this->order->addOrder($res);//資料庫生成訂單
	$this->assign('payinfo',$payinfo);

	$data = $this->pay->get_paysign($item_id,$order_sn,$openid);//微信支付訂單生成(商品ID,訂單號,微信使用者openid)
	$this->assign('data',$data);

	return $this->fetch();
}
微信使用者openid獲取方法
 public function get_openid()
{
     vendor('pay.WxPayApi') ;
     vendor('pay.WxPayJsApiPay');
     if(empty(Session::get('front_pay_openid'))){
         $pay = new \JsApiPay();
         $openid = $pay->GetOpenid();  
         Session::set('front_pay_openid',$openid);   
     }  
 }