微信公众号支付(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;
    }
}

猜你喜欢

转载自blog.csdn.net/kolinhu/article/details/83054451