You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
344 lines
9.2 KiB
344 lines
9.2 KiB
<?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";
|
|
}
|
|
}
|
|
}
|
|
|