tp5.1 微信支付

引用:

http://www.thinkphp.cn/code/3593.html

Github查看最新代码https://github.com/dream2023/ThinkPHP5-wxpay

原文件适合TP5.0的以下的,微信支付参数都是固定的读取

 

单独微信H5支付可以参考:https://blog.csdn.net/haibo0668/article/details/81273278

 

我现在把上面的代码整合到TP5.1中,微信支付参数放到公共文件中读取

完整TP5.1文件包:https://download.csdn.net/download/haibo0668/10587904

重新修改的包在这里下载:https://download.csdn.net/download/haibo0668/10587914

一、微信扫码支付:重点整理扫码支付,不修改是生成不了二维码的

1、修改\extend\wxpay\NativePay.php文件,修正后的代码

checkParams($params);
        if(empty($params['product_id'])) {
            throw new \WxPayException('商品ID(product_id)商品ID必须');
        }

        // 2.组装参数
        $input = $that->getPostData($params);

        // 3.进行请求
        $tools = new \WxPayNativePay();
        $result = $tools->GetPayUrl($input);

        // 4.进行结果检验
        $that->checkResult($result);

        // 5.返回支付二维码图片
        $url = urlencode($result["code_url"]);
		
		//$payImage = $that->qrCode($url);
        $payImage = "扫码支付";
        return $payImage;
    }

    // 组装请求参数
    private function getPostData($params)
    {
        $input  = new \WxPayUnifiedOrder();
        $input->SetBody($params['body']);
        $input->SetOut_trade_no($params['out_trade_no']);
        $input->SetTotal_fee($params['total_fee']);
        // $input->SetGoods_tag("test");
        $input->SetNotify_url(\WxPayConfig::NOTIFY_URL);
        $input->SetTrade_type("NATIVE");
        $input->SetProduct_id($params['product_id']);
        return $input;
    }
}

重点:TP5.1不支持

use think\Loader;

Loader::import('wxpay.lib.WxPayNativePay');

引用文件,需要修改成

tp5.1 微信支付_第1张图片

 

2、在\application\index\controller\Example.php文件中增加生成二维码函数

    // 扫码支付 生成二维码后转换成图片二维码
    public function qrcodeUrl()
    {
    	require '../extend/wxpay/lib/Phpqrcode.php';//二维码
			$url = urldecode(input('data'));
			if(substr($url, 0, 6) == "weixin"){
		         $qrcode_tools = new \QRcode();
		         echo $qrcode_tools->png($url);
				//QRcode::png($url);
			}else{
				 echo header('HTTP/1.1 404 Not Found');
			}
    }

Example.php代码:

 '支付测试',
            'out_trade_no' => mt_rand().time(),
            'total_fee' => 1,
            'product_id' => time(),
        ];
        //db('order')->insert($params);
        $result = \wxpay\NativePay::getPayImage($params);
        echo $result;
    }

    // 公众号支付
    public function jspay()
    {
        $params = [
            'body' => '支付测试',
            'out_trade_no' => mt_rand().time(),
            'total_fee' => 1,
        ];
        $result = \wxpay\JsapiPay::getPayParams($params);
        halt($result);
    }

    // 小程序支付
    public function smallapp()
    {
        $params = [
            'body'         => '支付测试',
            'out_trade_no' => mt_rand().time(),
            'total_fee'    => 1,
        ];
        $code = '08123gA41K4EQO1RH1B41uP2A4123gAW';
        $result = \wxpay\JsapiPay::getPayParams($params, $code);

        $openId = 'oCtoK0SjxW-N5qjEDgaMyummJyig';
        $result = \wxpay\JsapiPay::getParams($params, $openId);
    }

    // 刷卡支付
    public function micropay()
    {
        $params = [
            'body' => '支付测试',
            'out_trade_no' => mt_rand().time(),
            'total_fee' => 1,
        ];

        $auth_code = '134628839776154108';
        $result = \wxpay\MicroPay::pay($params, $auth_code);
        halt($result);
    }

    // H5支付
    public function wappay()
    {
        $params = [
            'body' => '支付测试',
            'out_trade_no' => mt_rand().time(),
            'total_fee' => 1,
        ];

        $result = \wxpay\WapPay::getPayUrl($params);
        halt($result);
    }

    // 订单查询
    public function query()
    {
        $out_trade_no = '290000985120170917160005';
        $result = \wxpay\Query::exec($out_trade_no);
        halt($result);
    }

    // 退款
    public function refund()
    {
        $params = [
            'out_trade_no' => '290000985120170917160005',
            'total_fee' => 1,
            'refund_fee' => 1,
            'out_refund_no' => time()
        ];
        $result = \wxpay\Refund::exec($params);
        halt($result);
    }

    // 退款查询
    public function refundquery()
    {
        $order_no = '290000985120170917160005';
        $result = \wxpay\RefundQuery::exec($order_no);
        halt($result);
    }

    // 下载对账单
    public function download()
    {
        $result = \wxpay\DownloadBill::exec('20170923');
        echo($result);
    }

    // 通知测试
    public function notify()
    {
        $notify = new \wxpay\Notify();
        $notify->Handle();
    }
	
    // 扫码支付 生成二维码后转换成图片二维码
    public function qrcodeUrl()
    {
    	require '../extend/wxpay/lib/Phpqrcode.php';//二维码
			$url = urldecode(input('data'));
			if(substr($url, 0, 6) == "weixin"){
		         $qrcode_tools = new \QRcode();
		         echo $qrcode_tools->png($url);
				//QRcode::png($url);
			}else{
				 echo header('HTTP/1.1 404 Not Found');
			}
    }
	
	
}

 

回调问题:

本地测试是回调不了,所以上面扫码支付是测试不了回调的,需要调试回调,就要在服务器上测试

设置好正确的回调地址,所谓正确的地址必须在微信公众号设置的支付授权目录(或测试授权目录)下,且域名要和微信公众号绑定的服务器地址域名相同。

扫码支付需要回调网址的,记得填写上

然后上传服务器测试

引用:https://www.cnblogs.com/lhat/p/5611242.html

 

二、微信公众号支付

控制器代码中:

	//支付
    public function payment()
    {
    	$type=input('type');//1=微信扫码  2=微信公众号 3=微信H5支付 4=支付宝PC电脑扫码 5=支付宝移动  6=银联 7=小程序支付 8=微信刷卡支付 
	    $out_trade_no=input('WIDout_trade_no');
//		$total_fee=input('WIDtotal_amount');
//  	$arr['WIDsubject']=input('WIDsubject');//订单名称 商品简单描述
//  	$arr['WIDout_trade_no']=input('WIDout_trade_no');//订单号
//  	$arr['WIDtotal_amount']=input('WIDtotal_amount');//总价格 如果购买多个商品,就是多个商品的总价 ,单位是分,微信只能是整数 *100
//  	$arr['type']=$type;
//		$arr['satat']=1;
		
		


       if($type==2){//=2是微信公众号  微信公众号先不要一开始就在系统中生成订单
            $this->getparams();//生成params数组
	   }else{
            $this->getOrder();//生成订单
	   }

		
				if($type==1){//微信PC扫码支付
				
				       $out_trade_no=input('WIDout_trade_no');//订单号
				       $this->assign('out_trade_no',$out_trade_no);
					   //$this->assign('number',$out_trade_no);
				
				        $params = [
				            'body' => input('WIDsubject'),//订单名称 商品简单描述
				            'out_trade_no' => input('WIDout_trade_no'),//订单号
				            'total_fee' => input('WIDtotal_amount')*100,//总价格 如果购买多个商品,就是多个商品的总价 ,单位是分,微信只能是整数 *100
				            'product_id' => time(),//商品ID 可以单个商品,也可以多个商品ID,例子:12,35,58
				        ];
		//		        //db('order')->insert($params);
		                
				        $result = \wxpay\NativePay::getPayImage($params);
				        echo $result;
						
						return view(wxcodepay);
							
				}elseif($type==2){//微信公众号
				

				        $params = [
				            'body' => input('WIDsubject'),//订单名称 商品简单描述
				            'type' => input('type'),//微信第二次转跳的时候需要带些参数回来  1=微信扫码  2=微信公众号 3=微信H5支付 4=支付宝PC电脑扫码 5=支付宝移动  6=银联 7=小程序支付 8=微信刷卡支付 
				            'out_trade_no' => input('WIDout_trade_no'),//订单号
				            'total_fee' => input('WIDtotal_amount')*100,//总价格 如果购买多个商品,就是多个商品的总价 ,单位是分,微信只能是整数 *100
				        ];
						
				        $result = \wxpay\JsapiPay::getPayParams($params);
						//$result = str_replace('\"', '\'', $result);
						//halt($result);
						$result = json_decode($result,true);//转为数组
						$this->assign('result',$result); 
						
						//dump($result);die;
						//return $result;
				        //halt($result);
						
						return view(index);
						
				}elseif($type==3){//微信H5支付
				
				        $params = [
				            'body' => input('WIDsubject'),//订单名称 商品简单描述
				            'out_trade_no' => input('WIDout_trade_no'),//订单号
				            'total_fee' => input('WIDtotal_amount')*100,//总价格 如果购买多个商品,就是多个商品的总价 ,单位是分,微信只能是整数 *100
				        ];
				        $result = \wxpay\WapPay::getPayUrl($params);
							
				        halt($result);
						
				}elseif($type==4){//支付宝PC扫码支付
				        \alipay\Pagepay::pay($this->params);//支付宝电脑PC扫码支付
				}elseif($type==5){//支付宝移动支付
				        \alipay\Wappay::pay($this->params);//支付宝移动支付
				}elseif($type==6){//银联
				
				}elseif($type==7){//微信小程序支付
				
				        $params = [
				            'body' => input('WIDsubject'),//订单名称 商品简单描述
				            'out_trade_no' => input('WIDout_trade_no'),//订单号
				            'total_fee' => input('WIDtotal_amount')*100,//总价格 如果购买多个商品,就是多个商品的总价 ,单位是分,微信只能是整数 *100
				        ];
				        $code = '08123gA41K4EQO1RH1B41uP2A4123gAW';
				        $result = \wxpay\JsapiPay::getPayParams($params, $code);
				
				        $openId = 'oCtoK0SjxW-N5qjEDgaMyummJyig';
				        $result = \wxpay\JsapiPay::getParams($params, $openId);
						
				}elseif($type==8){//微信刷卡支付
				
				        $params = [
				            'body' => input('WIDsubject'),//订单名称 商品简单描述
				            'out_trade_no' => input('WIDout_trade_no'),//订单号
				            'total_fee' => input('WIDtotal_amount')*100,//总价格 如果购买多个商品,就是多个商品的总价 ,单位是分,微信只能是整数 *100
				        ];
				
				        $auth_code = '134628839776154108';
				        $result = \wxpay\MicroPay::pay($params, $auth_code);
				        halt($result);
						
				}else{
					$this->error('错误:请选择支付方式!');
				}
		

    }

tp5.1 微信支付_第2张图片tp5.1 微信支付_第3张图片tp5.1 微信支付_第4张图片

$result = json_decode($result,true);//转为数组,模板中调用

     /**
     * 当TYPE=2时,即微信公众号支付时,不生成订单,生成$params
	 * 获取订单信息, 必须包含订单号和订单金额
     *
     * @return string $params['out_trade_no'] 商户订单
     * @return float  $params['total_amount'] 订单金额
     */
    public function getparams()
    {
    	 $number=input('WIDout_trade_no');//订单号
		 $title=input('WIDsubject');//订单名称 商品简单描述  支付宝支付
		 $body=input('WIDsubject');//订单名称 商品简单描述  微信支付
		 $price=input('WIDtotal_amount');//总价格 如果购买多个商品,就是多个商品的总价
		 $type=input('type');
		 $state=0;//状态 0未支付 1已支付
		 $type_state=0;//订单类型 0单个购买 1购买多个商品

		 
	       $params['type']=input('type');//支付类型  大家都有的
	  	   $params['out_trade_no']=input('WIDout_trade_no');//订单号
	       $params['subject']=input('WIDsubject');//订单名称 商品简单描述  支付宝支付
		   $params['body']=input('WIDsubject');//订单名称 商品简单描述  微信支付
		   $params['total_amount']=input('WIDtotal_amount');//总价格 如果购买多个商品,就是多个商品的总价
		   
		    if($number && $price){
			  	   $data['number']=$number;
			       $data['title']=$title;
				   $data['price']=$price;
			  	   $data['state']=$state;
				   $data['type']=$type;
				   $data['type_state']=$type_state;
				   
				   $order_rs=db('order')->insert($data);
		    }
	
				   
		 $this->params = $params;
	}

 

 

模板代码:两段代码一定要有才能调用微信

tp5.1 微信支付_第5张图片

 

在微信公众号支付中,微信那个文件包文件还有修改的。因为传值的问题

JsapiPay.php

   public static function getPayParams($params, $code='')
    {
    	//$code=input('code');
        $tools = new \WxPayJsPay();
		//dump($params);
        //$openId = $tools->GetOpenid($params);
		$params2 = $tools->GetOpenid($params);
		return self::getParams($params2, $params2['openid']);
        //return self::getParams($params, $openId);
    }

WxPayJsPay.php

	public function GetOpenid($params)
	{
		//通过code获得openid,第一次从自己系统上过来,CODE是空的,从下面if (empty($code)){这步中,微信登录授权再转跳一次网址,带来CODE值,CODE不为空就执行$openid = $this->GetOpenidFromMp($code);这步来获取$openid
		//要把参数$params传回去,不然微信第二次转跳的时候$params就变成空了
		$url_params="?body=".$params['body']."&out_trade_no=".$params['out_trade_no']."&total_fee=".$params['total_fee']."&type=".$params['type'];
		$code=input('code');

		//dump($params);
		if (empty($code)){
		//if (!isset($_GET['code'])){
			//触发微信返回code码
			$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].$_SERVER['QUERY_STRING'].$url_params);
			//$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']);
			//dump($baseUrl);die;
			$url = $this->__CreateOauthUrlForCode($baseUrl);
			//dump($url);die;
			Header("Location: $url");
			exit();
		} else {
			//获取code码,以获取openid
			//dump(input('param.'));die;
			$openid = $this->GetOpenidFromMp($code);
		        $params = [
		            'body' => input('body'),
		            'type' => input('type'),
		            'out_trade_no' => input('out_trade_no'),
		            'total_fee' => input('total_fee'),
		            'openid' => $openid,
		        ];
			  return $params;//传数组回去,因为要带body、type、out_trade_no这些参数回去,所以只能传数组回去
			//return $openid;//传一个$openid回去
		}
	}

tp5.1 微信支付_第6张图片

微信登录公众号授权后再转跳一次,所以我加上之前的值回来。不然转跳后之前的值就变空了

 

完全案例:

 

完整TP5.1文件包:https://download.csdn.net/download/haibo0668/10587904

1、把微信支付包:https://download.csdn.net/download/haibo0668/10587914(还要修改一个地方,看最下面,包中没有更新)下载解压后把文件夹放到\extend\下

2、微信支付参数,\application\common.php中

//微信支付参数
function wx_confing(){
					
				//网址
					$http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';////判断http还是https
					$pay_url = $http_type.$_SERVER['HTTP_HOST'];
					
				$config['APPID']='wxf33ba';//绑定支付的APPID(必须配置,开户邮件中可查看)
				$config['MCHID']='148122';//商户号(必须配置,开户邮件中可查看)
				$config['WXPAY_DEBUG']=true;//开发模式与生产模式 微信支付需要获取用户的真实ip, 本地开发就需要设定一个固定的IP,  处于生产模式, 请务必将次改为false, 用于获取用户真实IP!!!!
				$config['NOTIFY_URL']=$pay_url.'/pay/index/notify';//异步通知地址
				$config['KEY']='icpuhyk0fdgfdgddfgdl0k50q';//商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置)设置地址:https://pay.weixin.qq.com/index.php/account/api_cert
				$config['APPSECRET']='4ed12dfb65765gfhgf2972';//公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置),
				//=======【证书路径设置】=====================================
				/**
				 * TODO:设置商户证书路径
				 * 证书路径,注意应该填写绝对路径(仅退款、撤销订单时需要,可登录商户平台下载,
				 * API证书下载地址:https://pay.weixin.qq.com/index.php/account/api_cert,下载之前需要安装商户操作证书)
				 * @var path
				 */
				$config['SSLCERT_PATH']='/wxpay/cert/apiclient_cert.pem';
				$config['SSLKEY_PATH']='/wxpay/cert/apiclient_key.pem';
				//=======【curl代理设置】===================================
				/**
				 * TODO:这里设置代理机器,只有需要代理的时候才设置,不需要代理,请设置为0.0.0.0和0
				 * 本例程通过curl使用HTTP POST方法,此处可修改代理服务器,
				 * 默认CURL_PROXY_HOST=0.0.0.0和CURL_PROXY_PORT=0,此时不开启代理(如有需要才设置)
				 * @var unknown_type
				 */
				$config['CURL_PROXY_HOST']="0.0.0.0";//"10.152.18.220";
				$config['CURL_PROXY_PORT']=0;//8080;
				//=======【上报信息配置】===================================
				/**
				 * TODO:接口调用上报等级,默认紧错误上报(注意:上报超时间为【1s】,上报无论成败【永不抛出异常】,
				 * 不会影响接口调用流程),开启上报之后,方便微信监控请求调用的质量,建议至少
				 * 开启错误上报。
				 * 上报等级,0.关闭上报; 1.仅错误出错上报; 2.全量上报
				 * @var int
				 */
				$config['REPORT_LEVENL']=1;//
	      // ======【日志文件目录】===================================
				$config['WXPAY_LOG']='/wxpay';//
				
				return $config;
}

3、控制器文件:\application\pay\controller\Wx.php (这里可以随意自己)

 '支付测试',
            'out_trade_no' => mt_rand().time(),
            'total_fee' => 1,
            'product_id' => time(),
        ];
        //db('order')->insert($params);
        $result = \wxpay\NativePay::getPayImage($params);
        echo $result;
    }

    // 公众号支付
    public function jspay()
    {
        $params = [
            'body' => '支付测试',
            'out_trade_no' => mt_rand().time(),
            'total_fee' => 1,
        ];
        $result = \wxpay\JsapiPay::getPayParams($params);
        halt($result);
    }

    // 小程序支付
    public function smallapp()
    {
        $params = [
            'body'         => '支付测试',
            'out_trade_no' => mt_rand().time(),
            'total_fee'    => 1,
        ];
        $code = '08123gA41K4EQO1RH1B41uP2A4123gAW';
        $result = \wxpay\JsapiPay::getPayParams($params, $code);

        $openId = 'oCtoK0SjxW-N5qjEDgaMyummJyig';
        $result = \wxpay\JsapiPay::getParams($params, $openId);
    }

    // 刷卡支付
    public function micropay()
    {
        $params = [
            'body' => '支付测试',
            'out_trade_no' => mt_rand().time(),
            'total_fee' => 1,
        ];

        $auth_code = '134628839776154108';
        $result = \wxpay\MicroPay::pay($params, $auth_code);
        halt($result);
    }

    // H5支付
    public function wappay()
    {
        $params = [
            'body' => '支付测试',
            'out_trade_no' => mt_rand().time(),
            'total_fee' => 1,
        ];

        $result = \wxpay\WapPay::getPayUrl($params);
        halt($result);
    }

    // 订单查询
    public function query()
    {
        $out_trade_no = '290000985120170917160005';
        $result = \wxpay\Query::exec($out_trade_no);
        halt($result);
    }

    // 退款
    public function refund()
    {
        $params = [
            'out_trade_no' => '290000985120170917160005',
            'total_fee' => 1,
            'refund_fee' => 1,
            'out_refund_no' => time()
        ];
        $result = \wxpay\Refund::exec($params);
        halt($result);
    }

    // 退款查询
    public function refundquery()
    {
        $order_no = '290000985120170917160005';
        $result = \wxpay\RefundQuery::exec($order_no);
        halt($result);
    }

    // 下载对账单
    public function download()
    {
        $result = \wxpay\DownloadBill::exec('20170923');
        echo($result);
    }

    // 通知测试
    public function notify()
    {
    	//dump(wx_confing());die;
        $notify = new \wxpay\Notify();
        $notify->Handle();
		
    }
	
    // 扫码支付 生成二维码后转换成图片二维码
    public function qrcodeUrl()
    {
    	    require '../extend/wxpay/lib/Phpqrcode.php';//引入生成生成二维码文件
			$url = urldecode(input('data'));
			if(substr($url, 0, 6) == "weixin"){
		         $qrcode_tools = new \QRcode();
		         echo $qrcode_tools->png($url);
				//QRcode::png($url);
			}else{
				 echo header('HTTP/1.1 404 Not Found');
			}
    }
	
	
}

还需要修改微信支付文件:

一、引用微信支付文件包中:\extend\wxpay\lib\WxPayJsPay.php  还有修改,不然后收不到值

增加接收参数代码

tp5.1 微信支付_第7张图片

 

二、修改

\extend\wxpay\lib\WxPayMicroPay.php

tp5.1 微信支付_第8张图片

			//$queryResult = $this->query($out_trade_no, $succResult);
			$queryResult = Db::query($out_trade_no, $succResult);

在TP5之后的写法为:

读数据使用 Db::query
写数据使用 Db::execute

你可能感兴趣的:(thinkphp5,微信)