135 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			135 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace addons\epay\controller;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								use addons\epay\library\Service;
							 | 
						|||
| 
								 | 
							
								use fast\Random;
							 | 
						|||
| 
								 | 
							
								use think\addons\Controller;
							 | 
						|||
| 
								 | 
							
								use Exception;
							 | 
						|||
| 
								 | 
							
								use think\Log;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								/**
							 | 
						|||
| 
								 | 
							
								 * 微信支付宝整合插件首页
							 | 
						|||
| 
								 | 
							
								 *
							 | 
						|||
| 
								 | 
							
								 * 此控制器仅用于开发展示说明和测试,请自行添加一个新的控制器进行处理返回和回调事件,同时删除此控制器文件
							 | 
						|||
| 
								 | 
							
								 *
							 | 
						|||
| 
								 | 
							
								 * Class Index
							 | 
						|||
| 
								 | 
							
								 * @package addons\epay\controller
							 | 
						|||
| 
								 | 
							
								 */
							 | 
						|||
| 
								 | 
							
								class Index extends Controller
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    protected $layout = 'default';
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    protected $config = [];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    public function _initialize()
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        parent::_initialize();
							 | 
						|||
| 
								 | 
							
								        if (!config("app_debug")) {
							 | 
						|||
| 
								 | 
							
								            $this->error("仅在开发环境下查看");
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    public function index()
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        $this->view->assign("title", "微信支付宝整合");
							 | 
						|||
| 
								 | 
							
								        return $this->view->fetch();
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * 体验,仅供开发测试
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public function experience()
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        $amount = $this->request->post('amount');
							 | 
						|||
| 
								 | 
							
								        $type = $this->request->post('type');
							 | 
						|||
| 
								 | 
							
								        $method = $this->request->post('method');
							 | 
						|||
| 
								 | 
							
								        $openid = $this->request->post('openid', "");
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        if (!$amount || $amount < 0) {
							 | 
						|||
| 
								 | 
							
								            $this->error("支付金额必须大于0");
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        if (!$type || !in_array($type, ['alipay', 'wechat'])) {
							 | 
						|||
| 
								 | 
							
								            $this->error("支付类型不能为空");
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        if (in_array($method, ['miniapp', 'mp']) && !$openid) {
							 | 
						|||
| 
								 | 
							
								            $this->error("openid不能为空");
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        //订单号
							 | 
						|||
| 
								 | 
							
								        $out_trade_no = date("YmdHis") . mt_rand(100000, 999999);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        //订单标题
							 | 
						|||
| 
								 | 
							
								        $title = '测试订单';
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        //回调链接
							 | 
						|||
| 
								 | 
							
								        $notifyurl = $this->request->root(true) . '/addons/epay/index/notifyx/paytype/' . $type;
							 | 
						|||
| 
								 | 
							
								        $returnurl = $this->request->root(true) . '/addons/epay/index/returnx/paytype/' . $type . '/out_trade_no/' . $out_trade_no;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $response = Service::submitOrder($amount, $out_trade_no, $type, $title, $notifyurl, $returnurl, $method, $openid);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        return $response;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * 支付成功,仅供开发测试
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public function notifyx()
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        $paytype = $this->request->param('paytype');
							 | 
						|||
| 
								 | 
							
								        $pay = Service::checkNotify($paytype);
							 | 
						|||
| 
								 | 
							
								        if (!$pay) {
							 | 
						|||
| 
								 | 
							
								            return json(['code' => 'FAIL', 'message' => '失败'], 500, ['Content-Type' => 'application/json']);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        // 获取回调数据,V3和V2的回调接收不同
							 | 
						|||
| 
								 | 
							
								        $data = Service::isVersionV3() ? $pay->callback() : $pay->verify();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        try {
							 | 
						|||
| 
								 | 
							
								            //微信支付V3返回和V2不同
							 | 
						|||
| 
								 | 
							
								            if (Service::isVersionV3() && $paytype === 'wechat') {
							 | 
						|||
| 
								 | 
							
								                $data = $data['resource']['ciphertext'];
							 | 
						|||
| 
								 | 
							
								                $data['total_fee'] = $data['amount']['total'];
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            \think\Log::record($data);
							 | 
						|||
| 
								 | 
							
								            //获取支付金额、订单号
							 | 
						|||
| 
								 | 
							
								            $payamount = $paytype == 'alipay' ? $data['total_amount'] : $data['total_fee'] / 100;
							 | 
						|||
| 
								 | 
							
								            $out_trade_no = $data['out_trade_no'];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            \think\Log::record("回调成功,订单号:{$out_trade_no},金额:{$payamount}");
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            //你可以在此编写订单逻辑
							 | 
						|||
| 
								 | 
							
								        } catch (Exception $e) {
							 | 
						|||
| 
								 | 
							
								            \think\Log::record("回调逻辑处理错误:" . $e->getMessage(), "error");
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        //下面这句必须要执行,且在此之前不能有任何输出
							 | 
						|||
| 
								 | 
							
								        if (Service::isVersionV3()) {
							 | 
						|||
| 
								 | 
							
								            return $pay->success()->getBody()->getContents();
							 | 
						|||
| 
								 | 
							
								        } else {
							 | 
						|||
| 
								 | 
							
								            return $pay->success()->send();
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * 支付返回,仅供开发测试
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public function returnx()
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        $paytype = $this->request->param('paytype');
							 | 
						|||
| 
								 | 
							
								        $out_trade_no = $this->request->param('out_trade_no');
							 | 
						|||
| 
								 | 
							
								        $pay = Service::checkReturn($paytype);
							 | 
						|||
| 
								 | 
							
								        if (!$pay) {
							 | 
						|||
| 
								 | 
							
								            $this->error('签名错误', '');
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        //你可以在这里定义你的提示信息,但切记不可在此编写逻辑
							 | 
						|||
| 
								 | 
							
								        $this->success("请返回网站查看支付结果", addon_url("epay/index/index"));
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |