1. 程式人生 > >微信公眾號支付(tp5)

微信公眾號支付(tp5)

                                        微信公眾號支付


微信下載的sdk包appid和secret...配置項是放在了配置檔案裡。但在實際運用中你要用到多個賬戶進行測試,每次都要對配置檔案進行更改。為了避免多人使用衝突的實現在這裡對微信官方給的sdk中的統一下單&&獲取openid進行了更改,可重複調取使用。

更改後skd github存放地址( 

https://github.com/linhue/wxpayment )

使用方法 引入Wxpayments.php服務類檔案:

<?php
namespace app\admin\controller;

use think\Controller;
use wxpayment\JsApiPay;
use wxpayment\WxPayments;
class Index extends Controller
{  
    $WxPayment = new WxPayments();
       //第一步 -> 此步驟為配置引數方法必須放在其他操作之前(儲存在WxPaymentData物件中)  sdk中的WxPayConfig.php丟棄使用由此方法代替設定需要使用的引數
        //獲取openid只需要設定 app_id && app_secret
        //支付需要設定 app_id &&  mch_id && key
       $WxPayment->setPayConfig(['app_id'=>'**','mch_id'=>**,'app_secret'=>'**','key'=>'**']);
       //第二步-> 此處為繼續使用JsApiPay.php調取三方登陸獲取code然後獲取openid,內部使用的引數調取的是WxPaymentData物件中引數
       $info = (new JsApiPay())->GetOpenid('htttps://www.***.com/admin/index/index');//此處為三方授權登陸回撥地址 
       $openid = $info['openid'];

        //第三步 調取微信 統一下單介面  $data所包含
        //必選 :: openid(支付使用者的openid)   notify_url(支付成功通知地址)  total_fee(支付金額)
     	//非必選 :: body(標題)  attach(詳情)    time_start(開始時間) goods_tag  trade_type(公眾號網頁支付預設為 JSAPI)
        $order = $WxPayment->payments($data);

        //第四步 生成paysign 傳給前端調取支付頁面。
        $paysign = $WxPayment->getPaySign($order);
    }  
}

(請根據實際情況,合理安排各個步驟)

以下是 WxPayments 服務類容程式碼。

<?php

namespace wxpayment;

use wxpayment\WxPayApi;

use wxpayment\WxPayUnifiedOrder;

use wxpayment\JsApiPay;

use wxpayment\WxPaymentData;

/** 
*支付請求微信下單
* 
*微信公眾號支付。 
* @author      linhu<[email protected]> 
* @version     $Id$ 
* @since        1.0 
*/ 
final class WxPayments
{
    /**
     * 生成訂單資訊 
     * (JSAPI)所需引數   
     *		必選 :: openid(支付使用者的openid)   notify_url(支付成功通知地址)  total_fee(支付金額)
     *		非必選 :: body(標題)  attach(詳情)    time_start(開始時間) goods_tag  trade_type(公眾號網頁支付預設為 JSAPI)
     *		return array 統一下單的資訊 
     *(WEB)所需引數
     *      必選 :: trade_type=>MWEB 
     *		return prepay_id(*) 微信預支付標識
     *
     * @access public
     * @param array $arr 使用者資料
     * @return object 返回型別
     */	
	public function payments($payinfo=[])
	{
		 $input = new WxPayUnifiedOrder();
		 //設定支付標題
		 	$body = !empty($payinfo['body'])?$payinfo['body']:'test';
		 $input->SetBody($body); 

		 	$attach = !empty($payinfo['attach'])?$payinfo['attach']:'test';
		 $input->SetAttach($attach);

		 $input->SetOut_trade_no(WxPaymentData::getMchid().date("YmdHis"));
		 //設定支付金額 以分為單位 所以此處需要*100
		 $input->SetTotal_fee($payinfo['total_fee']*100); 

		 //支付發起時間
		 	$time_start = !empty($payinfo['time_start'])?$payinfo['time_start']:date('YmdHis');
		 $input->SetTime_start($time_start);

		 $input->SetTime_expire(date("YmdHis", time() + 6000));
		 //支付發起時間
		 	$goods_tag = !empty($payinfo['goods_tag'])?$payinfo['goods_tag']:'支付';
		 $input->SetGoods_tag($goods_tag);

		 //設定支付回撥通知url
		 	$notify_url = !empty($payinfo['notify_url'])?$payinfo['notify_url']:'';
		 $input->SetNotify_url($payinfo['notify_url']);

		 	$trade_type = !empty($payinfo['trade_type'])?$payinfo['trade_type']:'JSAPI';
		 $input->SetTrade_type($trade_type);
		 //設定支付使用者open_id
		 	$openid = !empty($payinfo['openid'])?$payinfo['openid']:'';
		  $input->SetOpenid($openid);
		  // var_dump($input);die;
		  //請求微信生成訂單資訊
		  $order = WxPayApi::unifiedOrder($input);
		  return $order;

	}

    /**
     * 設定引數 app_id app_secret mch_id
     *
     * @access public
     * @param array $arr 使用者資料
     * @return array 返回型別
     */	
	public function setPayConfig( $PayConfig=[])
	{
	    if(!array_key_exists('app_id',$PayConfig) or !array_key_exists('app_secret',$PayConfig) or !array_key_exists('mch_id',$PayConfig)){
		    return false;
	    }
	    $inputObj = new WxPaymentData();
	    WxPaymentData::setAppid($PayConfig['app_id']);
	    WxPaymentData::setSecret($PayConfig['app_secret']);
	    WxPaymentData::setMchid($PayConfig['mch_id']);
	    WxPaymentData::setMchkey($PayConfig['key']);
		return true;
	}

    /**
     * 拼接paysign
     *
     * @access public
     * @param array $arr 使用者資料
     * @return string 返回型別
     */		
	public function getPaySign($order=[])
	{
		return (new JsApiPay())->GetJsApiParameters($order);
	}

    /**
     * 下載今日賬單
     *  bill_date:賬單日期格式為: date('Ymd') 
     *  bill_type:(ALL||SUCCESS||REFUND||RECHARGE_REFUND)  預設為ALL
     * @access public
     * @param array $data 
     * @return string 
     */	
    public function download( array $data=null){
    	$inputObj  = new WxPaymentData();
    	// var_dump($inputObj);die;
        $inputObj->bill_date = !empty($data['bill_date'])?$data['bill_type']:date('Ymd');
    	$inputObj->bill_type = !empty($data['bill_type'])?$data['bill_type']:'ALL';    
    	
    	return WxPayApi::downloadBill($inputObj);
    }

    public function qrBizpayurl(){
    	return WxPayApi::bizpayurl(); 
    }

    /**
     *  web第三方只方支付
     *
     *  必選:: prepay_id 
     *  非必選:: trade_type  mweb_url
     *  必選-非必選 只限當前方法
     * @access public
     * @param array $data 
     * @return jump_web 
     */	    
    public function jumpWebUrl($data=[]){
    	if(!array_key_exists('prepay_id',$data)){
    		return false;
    	}
    	$mweb_url = !empty($data['mweb_url'])?'&mweb_url'.$data['mweb_url']:'';
    	$trade_type = !empty($data['trade_type'])?'&trade_type='.$data['trade_type']:'&trade_type=MWEB';
    	$url = 'https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?'.$mweb_url.$trade_type;
    	Header('location:'.$url);exit;
    }
}