345 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			345 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | ||
| // +----------------------------------------------------------------------
 | ||
| // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
 | ||
| // +----------------------------------------------------------------------
 | ||
| // | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
 | ||
| // +----------------------------------------------------------------------
 | ||
| // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
 | ||
| // +----------------------------------------------------------------------
 | ||
| // | Author: CRMEB Team <admin@crmeb.com>
 | ||
| // +----------------------------------------------------------------------
 | ||
| namespace crmeb\services\pay\extend\allinpay;
 | ||
| 
 | ||
| 
 | ||
| /**
 | ||
|  *
 | ||
|  * Class AllinPay
 | ||
|  * @author 等风来
 | ||
|  * @email 136327134@qq.com
 | ||
|  * @date 2022/12/27
 | ||
|  * @package crmeb\services\pay\extend\allinpay
 | ||
|  */
 | ||
| class AllinPay extends Client
 | ||
| {
 | ||
| 
 | ||
|     //统一支付接口
 | ||
|     const UNITODER_PAY_API = 'unitorder/pay';
 | ||
| 
 | ||
|     //统一扫码接口
 | ||
|     const UNITORDER_SCANQRPAY = 'unitorder/scanqrpay';
 | ||
| 
 | ||
|     //退款
 | ||
|     const UNITODER_TRANX_REFUND = 'tranx/refund';
 | ||
| 
 | ||
|     //订单查询
 | ||
|     const  UNITODER_TRANX_QUERY = 'tranx/query';
 | ||
| 
 | ||
|     const  UNITODER_QPAY_AGREEAPPLY = 'qpay/agreeapply';
 | ||
| 
 | ||
|     //微信公众号内支付请求地址
 | ||
|     const UNITODER_H5UNIONPAY = 'https://vsp.allinpay.com/apiweb/h5unionpay/unionorder';
 | ||
| 
 | ||
|     /**
 | ||
|      * @var string
 | ||
|      */
 | ||
|     protected $api = '';
 | ||
| 
 | ||
|     /**
 | ||
|      * 支付类型
 | ||
|      * @var string
 | ||
|      */
 | ||
|     protected $payType = '';
 | ||
| 
 | ||
|     /**
 | ||
|      * @var string
 | ||
|      */
 | ||
|     protected $version = '';
 | ||
| 
 | ||
|     /**
 | ||
|      * @var string
 | ||
|      */
 | ||
|     protected $orderKey = 'reqsn';
 | ||
| 
 | ||
|     /**
 | ||
|      * @var int
 | ||
|      */
 | ||
|     protected $validtime = 720;
 | ||
| 
 | ||
|     /**
 | ||
|      * 创建支付订单
 | ||
|      * @param string $trxamt
 | ||
|      * @param string $orderId
 | ||
|      * @param string $body
 | ||
|      * @param string|null $openId
 | ||
|      * @param string|null $appid
 | ||
|      * @param string $frontUrl
 | ||
|      * @param string $remark
 | ||
|      * @return mixed
 | ||
|      */
 | ||
|     public function create(string $trxamt, string $orderId, string $body, string $returl = null, string $openId = null, string $appid = null, string $frontUrl = '', string $remark = '')
 | ||
|     {
 | ||
|         $totalFee = (int)bcmul($trxamt, '100');
 | ||
| 
 | ||
|         $data = [
 | ||
|             'trxamt' => $totalFee,
 | ||
|             $this->orderKey => $orderId,
 | ||
|             'validtime' => $this->validtime,
 | ||
|             'notify_url' => $this->notifyUrl
 | ||
|         ];
 | ||
| 
 | ||
|         if ($body) {
 | ||
|             $data['body'] = $body;
 | ||
|         }
 | ||
| 
 | ||
|         if ($remark) {
 | ||
|             $data['remark'] = $remark;
 | ||
|         }
 | ||
| 
 | ||
|         if ($this->payType) {
 | ||
|             $data['paytype'] = $this->payType;
 | ||
|         }
 | ||
| 
 | ||
|         if ($returl) {
 | ||
|             $data['returl'] = $returl;
 | ||
|         }
 | ||
| 
 | ||
|         if ($openId) {
 | ||
|             $data['acct'] = $openId;
 | ||
|         }
 | ||
| 
 | ||
|         if ($appid) {
 | ||
|             $data['sub_appid'] = $appid;
 | ||
|         }
 | ||
| 
 | ||
|         if ($frontUrl) {
 | ||
|             $data['front_url'] = $frontUrl;
 | ||
|         }
 | ||
| 
 | ||
|         if ($this->version) {
 | ||
|             $data['version'] = $this->version;
 | ||
|         }
 | ||
| 
 | ||
|         $form = !$this->api;
 | ||
|         $api = $this->api;
 | ||
| 
 | ||
|         $this->version = '';
 | ||
|         $this->payType = '';
 | ||
|         $this->api = '';
 | ||
|         $this->orderKey = 'reqsn';
 | ||
|         $this->validtime = 720;
 | ||
| 
 | ||
|         return $this->send($api, ['data' => $data, 'form' => $form]);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 微信H5支付
 | ||
|      * @param string $trxamt
 | ||
|      * @param string $orderId
 | ||
|      * @param string $body
 | ||
|      * @param string $returl
 | ||
|      * @param string $remark
 | ||
|      * @return mixed
 | ||
|      */
 | ||
|     public function h5Pay(string $trxamt, string $orderId, string $body, string $returl, string $remark = '')
 | ||
|     {
 | ||
|         $this->version = self::VERSION_NUM_12;
 | ||
|         return $this->create($trxamt, $orderId, $body, $returl, null, null, '', $remark);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 微信js支付
 | ||
|      * @param string $trxamt
 | ||
|      * @param string $orderId
 | ||
|      * @param string $body
 | ||
|      * @param string $openId
 | ||
|      * @param string $appId
 | ||
|      * @param string $frontUrl
 | ||
|      * @param string $remark
 | ||
|      * @return mixed
 | ||
|      */
 | ||
|     public function wechatPay(string $trxamt, string $orderId, string $body, string $openId, string $appId, string $frontUrl, string $remark = '')
 | ||
|     {
 | ||
|         $this->api = self::UNITODER_PAY_API;
 | ||
|         return $this->create($trxamt, $orderId, $body, null, $openId, $appId, $frontUrl, $remark);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * app支付 微信和支付宝
 | ||
|      * @param string $trxamt
 | ||
|      * @param string $orderId
 | ||
|      * @param string $body
 | ||
|      * @param bool $isWechat
 | ||
|      * @param string $remark
 | ||
|      * @return mixed
 | ||
|      * @author 等风来
 | ||
|      * @email 136327134@qq.com
 | ||
|      * @date 2023/1/14
 | ||
|      */
 | ||
|     public function appPay(string $trxamt, string $orderId, string $body, string $appid, string $openid = null, bool $isWechat = true, string $remark = '')
 | ||
|     {
 | ||
|         $this->api = self::UNITODER_PAY_API;
 | ||
|         $this->payType = $isWechat ? 'A02' : 'A01';
 | ||
|         $this->version = self::VERSION_NUM_11;
 | ||
|         return $this->create($trxamt, $orderId, $body, null, $openid, $appid, '', $remark);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * PC 收银台支付
 | ||
|      * @param string $trxamt
 | ||
|      * @param string $orderId
 | ||
|      * @param string $body
 | ||
|      * @return mixed
 | ||
|      * @author 等风来
 | ||
|      * @email 136327134@qq.com
 | ||
|      * @date 2023/1/15
 | ||
|      */
 | ||
|     public function pcPay(string $trxamt, string $orderId, string $body, string $remark, bool $isWechat = true)
 | ||
|     {
 | ||
|         $this->api = self::UNITODER_PAY_API;
 | ||
|         $this->payType = $isWechat ? 'W01' : 'A01';
 | ||
|         $this->version = self::VERSION_NUM_11;
 | ||
|         $res = $this->create($trxamt, $orderId, $body, null, null, null, '', $remark);
 | ||
|         $invalid = time() + 60;
 | ||
|         if ($isWechat) {
 | ||
|             $key = 'code_url';
 | ||
|         } else {
 | ||
|             $key = 'qrCode';
 | ||
|         }
 | ||
|         return ['invalid' => $invalid, 'logo' => sys_config('wap_login_logo'), $key => $res['payinfo']];
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * @param string $trxamt
 | ||
|      * @param string $orderId
 | ||
|      * @param string $body
 | ||
|      * @param string $returl
 | ||
|      * @param string $remark
 | ||
|      * @return array
 | ||
|      * @author 等风来
 | ||
|      * @email 136327134@qq.com
 | ||
|      * @date 2023/1/15
 | ||
|      */
 | ||
|     public function miniproPay(string $trxamt, string $orderId, string $body, string $remark = '')
 | ||
|     {
 | ||
|         $totalFee = bcmul($trxamt, '100');
 | ||
| 
 | ||
|         $data = [
 | ||
|             'paytype' => 'W06',
 | ||
|             'trxamt' => $totalFee,
 | ||
|             'reqsn' => $orderId,
 | ||
|             'notify_url' => $this->notifyUrl,
 | ||
|             'body' => $body,
 | ||
|             'validtime' => (string)$this->validtime,
 | ||
|             'cusid' => $this->cusid,
 | ||
|             'appid' => $this->appid,
 | ||
|             'signtype' => $this->signType,
 | ||
|             'randomstr' => uniqid(),
 | ||
|             'remark' => $remark,
 | ||
|             'version' => self::VERSION_NUM_12
 | ||
|         ];
 | ||
| 
 | ||
|         $data['sign'] = $this->sign($data);
 | ||
| 
 | ||
|         return $data;
 | ||
|     }
 | ||
| 
 | ||
|     public function agreeapply()
 | ||
|     {
 | ||
|         $data = [
 | ||
|             'meruserid' => 'eesssxxx',
 | ||
|             'accttype' => '00',
 | ||
|             'acctno' => '',
 | ||
|             'idtype' => 0,
 | ||
|             'idno' => '',
 | ||
|             'acctname' => '',
 | ||
|             'mobile' => '',
 | ||
|             'cvv2' => '',
 | ||
|             'reqip' => request()->ip(),
 | ||
|             'reqtime' => date('Y-m-d H:i:s'),
 | ||
|             'version' => self::VERSION_NUM_11,
 | ||
|         ];
 | ||
| 
 | ||
|         $data['cusid'] = $this->cusid;
 | ||
|         $data['appid'] = $this->appid;
 | ||
|         $data['signtype'] = $this->signType;
 | ||
|         $data['randomstr'] = uniqid();
 | ||
|         $data['sign'] = $this->sign($data);
 | ||
| 
 | ||
|         return $this->request(self::UNITODER_QPAY_AGREEAPPLY, $data);
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
|     /**
 | ||
|      * 查询订单
 | ||
|      * @param string $reqsn
 | ||
|      * @return array|mixed
 | ||
|      * @author 等风来
 | ||
|      * @email 136327134@qq.com
 | ||
|      * @date 2023/1/15
 | ||
|      */
 | ||
|     public function query(string $reqsn)
 | ||
|     {
 | ||
|         $data = [
 | ||
|             'reqsn' => $reqsn
 | ||
|         ];
 | ||
| 
 | ||
|         return $this->send(self::UNITODER_TRANX_QUERY, ['data' => $data]);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 发起退款
 | ||
|      * @param string $trxamt
 | ||
|      * @param string $reqsn
 | ||
|      * @return array|mixed
 | ||
|      * @author 等风来
 | ||
|      * @email 136327134@qq.com
 | ||
|      * @date 2023/1/15
 | ||
|      */
 | ||
|     public function refund(string $trxamt, string $orderId, string $reqsn)
 | ||
|     {
 | ||
|         $totalFee = (int)bcmul($trxamt, '100');
 | ||
| 
 | ||
|         $data = [
 | ||
|             'trxamt' => $totalFee,
 | ||
|             'reqsn' => $orderId,
 | ||
|             'oldtrxid' => $reqsn,
 | ||
|         ];
 | ||
| 
 | ||
|         return $this->send(self::UNITODER_TRANX_REFUND, ['data' => $data]);
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 异步回调
 | ||
|      * @param callable $callback
 | ||
|      * @return string
 | ||
|      * @author 等风来
 | ||
|      * @email 136327134@qq.com
 | ||
|      * @date 2023/1/15
 | ||
|      */
 | ||
|     public function handleNotify(callable $callback)
 | ||
|     {
 | ||
|         $params = [];
 | ||
|         foreach (request()->post() as $key => $val) {
 | ||
|             $params[$key] = $val;
 | ||
|         }
 | ||
| 
 | ||
|         $this->debugLog('通联支付回调数据' . json_encode($params));
 | ||
| 
 | ||
|         if (count($params) < 1) {
 | ||
|             //如果参数为空,则不进行处理
 | ||
|             return "error";
 | ||
|         }
 | ||
| 
 | ||
|         $res = $this->validSign($params);
 | ||
| 
 | ||
|         $this->debugLog('通联支付回调验证:' . json_encode(['res' => $res]));
 | ||
| 
 | ||
|         if ($res && isset($params['trxstatus']) && $params['trxstatus'] === '0000') {
 | ||
|             //验签成功
 | ||
|             return $callback($params) ? 'success' : 'error';
 | ||
|         } else {
 | ||
|             return "error";
 | ||
|         }
 | ||
|     }
 | ||
| }
 |