2025-03-12 10:47:34 +08:00

345 lines
9.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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";
}
}
}