修改支付通道,增加通道编号传递

This commit is contained in:
Anyon 2020-12-14 15:35:06 +08:00
parent 23f670cf44
commit 80b3d7c8e5
5 changed files with 57 additions and 33 deletions

View File

@ -11,7 +11,7 @@
Target Server Version : 50562 Target Server Version : 50562
File Encoding : 65001 File Encoding : 65001
Date: 14/12/2020 14:20:05 Date: 14/12/2020 15:34:25
*/ */
SET NAMES utf8mb4; SET NAMES utf8mb4;
@ -139,6 +139,7 @@ CREATE TABLE `data_payment_item` (
`order_no` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '订单单号', `order_no` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '订单单号',
`order_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '订单描述', `order_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '订单描述',
`order_amount` decimal(20, 2) NULL DEFAULT 0.00 COMMENT '订单金额', `order_amount` decimal(20, 2) NULL DEFAULT 0.00 COMMENT '订单金额',
`payment_id` bigint(20) NULL DEFAULT 0 COMMENT '支付编号',
`payment_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '支付通道', `payment_type` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '支付通道',
`payment_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '支付单号', `payment_code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '支付单号',
`payment_status` tinyint(1) NULL DEFAULT 0 COMMENT '支付状态', `payment_status` tinyint(1) NULL DEFAULT 0 COMMENT '支付状态',
@ -147,6 +148,7 @@ CREATE TABLE `data_payment_item` (
`create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE, PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_data_payment_item_order_no`(`order_no`) USING BTREE, INDEX `idx_data_payment_item_order_no`(`order_no`) USING BTREE,
INDEX `idx_data_payment_item_pament_id`(`payment_id`) USING BTREE,
INDEX `idx_data_payment_item_payment_type`(`payment_type`) USING BTREE, INDEX `idx_data_payment_item_payment_type`(`payment_type`) USING BTREE,
INDEX `idx_data_payment_item_payment_status`(`payment_status`) USING BTREE INDEX `idx_data_payment_item_payment_status`(`payment_status`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据-支付-记录' ROW_FORMAT = COMPACT; ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '数据-支付-记录' ROW_FORMAT = COMPACT;
@ -4569,7 +4571,7 @@ CREATE TABLE `system_oplog` (
`username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '操作人用户名', `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '操作人用户名',
`create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `create_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统-日志' ROW_FORMAT = COMPACT; ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统-日志' ROW_FORMAT = COMPACT;
-- ---------------------------- -- ----------------------------
-- Records of system_oplog -- Records of system_oplog
@ -4577,6 +4579,7 @@ CREATE TABLE `system_oplog` (
INSERT INTO `system_oplog` VALUES (1, 'admin/login/index', '127.0.0.1', '系统用户登录', '登录系统后台成功', 'admin', '2020-12-14 06:00:24'); INSERT INTO `system_oplog` VALUES (1, 'admin/login/index', '127.0.0.1', '系统用户登录', '登录系统后台成功', 'admin', '2020-12-14 06:00:24');
INSERT INTO `system_oplog` VALUES (2, 'admin/menu/edit', '127.0.0.1', '系统菜单管理', '修改系统菜单[87]成功', 'admin', '2020-12-14 06:00:53'); INSERT INTO `system_oplog` VALUES (2, 'admin/menu/edit', '127.0.0.1', '系统菜单管理', '修改系统菜单[87]成功', 'admin', '2020-12-14 06:00:53');
INSERT INTO `system_oplog` VALUES (3, 'admin/menu/edit', '127.0.0.1', '系统菜单管理', '修改系统菜单[87]成功', 'admin', '2020-12-14 06:01:06'); INSERT INTO `system_oplog` VALUES (3, 'admin/menu/edit', '127.0.0.1', '系统菜单管理', '修改系统菜单[87]成功', 'admin', '2020-12-14 06:01:06');
INSERT INTO `system_oplog` VALUES (4, 'admin/login/index', '127.0.0.1', '系统用户登录', '登录系统后台成功', 'admin', '2020-12-14 06:34:19');
-- ---------------------------- -- ----------------------------
-- Table structure for system_queue -- Table structure for system_queue
@ -4642,7 +4645,7 @@ CREATE TABLE `system_user` (
-- ---------------------------- -- ----------------------------
-- Records of system_user -- Records of system_user
-- ---------------------------- -- ----------------------------
INSERT INTO `system_user` VALUES (10000, 'admin', '21232f297a57a5a743894a0e4a801fc3', '系统管理员', 'https://v6.thinkadmin.top/upload/ec/f571134493e54fe06855c88557052c.png', '', '', '', '', '127.0.0.1', '2020-12-14 06:00:24', 23, '', 1, 0, 0, '2015-11-13 15:14:22'); INSERT INTO `system_user` VALUES (10000, 'admin', '21232f297a57a5a743894a0e4a801fc3', '系统管理员', 'https://v6.thinkadmin.top/upload/ec/f571134493e54fe06855c88557052c.png', '', '', '', '', '127.0.0.1', '2020-12-14 06:34:19', 24, '', 1, 0, 0, '2015-11-13 15:14:22');
-- ---------------------------- -- ----------------------------
-- Table structure for wechat_fans -- Table structure for wechat_fans

View File

@ -16,17 +16,17 @@ class Notify extends Controller
/** /**
* 微信支付通知 * 微信支付通知
* @param string $scene 支付场景 * @param string $scene 支付场景
* @param string $type 支付通道 * @param string $param 支付通道
* @return string * @return string
* @throws \WeChat\Exceptions\InvalidResponseException * @throws \WeChat\Exceptions\InvalidResponseException
* @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException * @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException * @throws \think\db\exception\ModelNotFoundException
*/ */
public function wxpay(string $scene = 'order', string $type = ''): string public function wxpay(string $scene = 'order', string $param = ''): string
{ {
if (strtolower($scene) === 'order') { if (strtolower($scene) === 'order') {
return WechatPaymentService::instance()->notify($type); return WechatPaymentService::instance()->notify($param);
} else { } else {
return 'success'; return 'success';
} }
@ -35,16 +35,16 @@ class Notify extends Controller
/** /**
* 汇聚支付通知 * 汇聚支付通知
* @param string $scene 支付场景 * @param string $scene 支付场景
* @param string $type 支付通道 * @param string $param 支付通道
* @return string * @return string
* @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException * @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException * @throws \think\db\exception\ModelNotFoundException
*/ */
public function joinpay(string $scene = 'order', string $type = ''): string public function joinpay(string $scene = 'order', string $param = ''): string
{ {
if (strtolower($scene) === 'order') { if (strtolower($scene) === 'order') {
return JoinPaymentService::instance()->notify($type); return JoinPaymentService::instance()->notify($param);
} else { } else {
return 'success'; return 'success';
} }

View File

@ -52,6 +52,12 @@ abstract class PaymentService extends Service
], ],
]; ];
/**
* 支付通道编号
* @var integer
*/
protected static $id;
/** /**
* 默认支付类型 * 默认支付类型
* @var string * @var string
@ -79,6 +85,7 @@ abstract class PaymentService extends Service
*/ */
public static function build(string $payid): PaymentService public static function build(string $payid): PaymentService
{ {
static::$id = $payid;
if (isset(static::$driver[$payid])) { if (isset(static::$driver[$payid])) {
return static::$driver[$payid]; return static::$driver[$payid];
} }
@ -156,8 +163,8 @@ abstract class PaymentService extends Service
* @param string $orderNo 交易订单单号 * @param string $orderNo 交易订单单号
* @param string $payAmount 交易订单金额(元) * @param string $payAmount 交易订单金额(元)
* @param string $payTitle 交易订单名称 * @param string $payTitle 交易订单名称
* @param string $payDescription 订单订单描述 * @param string $payRemark 订单订单描述
* @return array * @return array
*/ */
abstract public function create(string $openid, string $orderNo, string $payAmount, string $payTitle, string $payDescription): array; abstract public function create(string $openid, string $orderNo, string $payAmount, string $payTitle, string $payRemark): array;
} }

View File

@ -61,15 +61,16 @@ class JoinPaymentService extends PaymentService
* @param string $orderNo 交易订单单号 * @param string $orderNo 交易订单单号
* @param string $payAmount 交易订单金额(元) * @param string $payAmount 交易订单金额(元)
* @param string $payTitle 交易订单名称 * @param string $payTitle 交易订单名称
* @param string $payDescription 订单订单描述 * @param string $payRemark 订单订单描述
* @return array * @return array
* @throws \think\Exception * @throws \think\Exception
*/ */
public function create(string $openid, string $orderNo, string $payAmount, string $payTitle, string $payDescription): array public function create(string $openid, string $orderNo, string $payAmount, string $payTitle, string $payRemark): array
{ {
try { try {
if (isset(static::TYPES[static::$type])) { if (isset(static::TYPES[static::$type])) {
$type = static::TYPES[static::$type]['type']; $tradeType = static::TYPES[static::$type]['type'];
$tradeParam = static::$type . '_' . static::$id;
} else { } else {
throw new \think\Exception('支付类型[' . static::$type . ']未配置定义!'); throw new \think\Exception('支付类型[' . static::$type . ']未配置定义!');
} }
@ -80,9 +81,9 @@ class JoinPaymentService extends PaymentService
'p3_Amount' => $payAmount * 100, 'p3_Amount' => $payAmount * 100,
'p4_Cur' => '1', 'p4_Cur' => '1',
'p5_ProductName' => $payTitle, 'p5_ProductName' => $payTitle,
'p6_ProductDesc' => $payDescription, 'p6_ProductDesc' => $payRemark,
'p9_NotifyUrl' => sysuri('@data/api.notify/joinpay/scene/order/type/' . static::$type, [], false, true), 'p9_NotifyUrl' => sysuri("@data/api.notify/joinpay/scene/order/param/{$tradeParam}", [], false, true),
'q1_FrpCode' => $type ?? '', 'q1_FrpCode' => $tradeType ?? '',
'q5_OpenId' => $openid, 'q5_OpenId' => $openid,
'q7_AppId' => $this->appid, 'q7_AppId' => $this->appid,
'qa_TradeMerchantNo' => $this->trade, 'qa_TradeMerchantNo' => $this->trade,
@ -93,7 +94,8 @@ class JoinPaymentService extends PaymentService
if (is_array($result) && isset($result['ra_Code']) && intval($result['ra_Code']) === 100) { if (is_array($result) && isset($result['ra_Code']) && intval($result['ra_Code']) === 100) {
// 创建支付记录 // 创建支付记录
$this->app->db->name('DataPaymentItem')->insert([ $this->app->db->name('DataPaymentItem')->insert([
'order_no' => $orderNo, 'order_name' => $payTitle, 'order_amount' => $payAmount, 'payment_type' => static::$type, 'order_no' => $orderNo, 'order_name' => $payTitle, 'order_amount' => $payAmount,
'payment_id' => static::$id, 'payment_type' => static::$type,
]); ]);
// 返回支付参数 // 返回支付参数
return json_decode($result['rc_Result'], true); return json_decode($result['rc_Result'], true);
@ -130,7 +132,11 @@ class JoinPaymentService extends PaymentService
*/ */
public function notify(string $type = ''): string public function notify(string $type = ''): string
{ {
$type = $type ?: static::$type; if (is_numeric(stripos($type, '_'))) {
[$payType, $payId] = explode('_', $type);
} else {
[$payType, $payId] = [$type ?: static::$type, static::$id];
}
$notify = $this->app->request->get(); $notify = $this->app->request->get();
foreach ($notify as &$item) $item = urldecode($item); foreach ($notify as &$item) $item = urldecode($item);
if (empty($notify['hmac']) || $notify['hmac'] !== $this->_doSign($notify)) { if (empty($notify['hmac']) || $notify['hmac'] !== $this->_doSign($notify)) {
@ -140,14 +146,15 @@ class JoinPaymentService extends PaymentService
// 更新支付记录 // 更新支付记录
data_save('DataPaymentItem', [ data_save('DataPaymentItem', [
'order_no' => $notify['r2_OrderNo'], 'order_no' => $notify['r2_OrderNo'],
'payment_type' => $type, 'payment_id' => $payId,
'payment_type' => $payType,
'payment_code' => $notify['r9_BankTrxNo'], 'payment_code' => $notify['r9_BankTrxNo'],
'payment_amount' => $notify['r3_Amount'], 'payment_amount' => $notify['r3_Amount'],
'payment_status' => 1, 'payment_status' => 1,
'payment_datatime' => date('Y-m-d H:i:s'), 'payment_datatime' => date('Y-m-d H:i:s'),
], 'order_no', ['payment_type' => $type, 'payment_status' => 0]); ], 'order_no', ['payment_type' => $payType, 'payment_status' => 0]);
// 更新记录状态 // 更新记录状态
if ($this->updateOrder($notify['r2_OrderNo'], $notify['r9_BankTrxNo'], $notify['r3_Amount'], $type)) { if ($this->updateOrder($notify['r2_OrderNo'], $notify['r9_BankTrxNo'], $notify['r3_Amount'], $payType)) {
return 'success'; return 'success';
} }
} }

View File

@ -51,26 +51,27 @@ class WechatPaymentService extends PaymentService
* @param string $orderNo 交易订单单号 * @param string $orderNo 交易订单单号
* @param string $payAmount 交易订单金额(元) * @param string $payAmount 交易订单金额(元)
* @param string $payTitle 交易订单名称 * @param string $payTitle 交易订单名称
* @param string $payDescription 订单订单描述 * @param string $payRemark 订单订单描述
* @return array * @return array
* @throws \think\Exception * @throws \think\Exception
*/ */
public function create(string $openid, string $orderNo, string $payAmount, string $payTitle, string $payDescription): array public function create(string $openid, string $orderNo, string $payAmount, string $payTitle, string $payRemark): array
{ {
try { try {
if (isset(static::TYPES[static::$type])) { if (isset(static::TYPES[static::$type])) {
$type = static::TYPES[static::$type]['type']; $tradeType = static::TYPES[static::$type]['type'];
$tradeParam = static::$type . '_' . static::$id;
} else { } else {
throw new \think\Exception('支付类型[' . static::$type . ']未配置定义!'); throw new \think\Exception('支付类型[' . static::$type . ']未配置定义!');
} }
$body = empty($payDescription) ? $payTitle : ($payTitle . '-' . $payDescription); $body = empty($payRemark) ? $payTitle : ($payTitle . '-' . $payRemark);
$data = [ $data = [
'body' => $body, 'body' => $body,
'openid' => $openid, 'openid' => $openid,
'out_trade_no' => $orderNo, 'out_trade_no' => $orderNo,
'total_fee' => $payAmount * 100, 'total_fee' => $payAmount * 100,
'trade_type' => $type, 'trade_type' => $tradeType ?: '',
'notify_url' => sysuri('@data/api.notify/wxpay/scene/order/type/' . static::$type, [], false, true), 'notify_url' => sysuri("@data/api.notify/wxpay/scene/order/param/{$tradeParam}", [], false, true),
'spbill_create_ip' => $this->app->request->ip(), 'spbill_create_ip' => $this->app->request->ip(),
]; ];
if (empty($data['openid'])) unset($data['openid']); if (empty($data['openid'])) unset($data['openid']);
@ -78,7 +79,8 @@ class WechatPaymentService extends PaymentService
if ($info['return_code'] === 'SUCCESS' && $info['result_code'] === 'SUCCESS') { if ($info['return_code'] === 'SUCCESS' && $info['result_code'] === 'SUCCESS') {
// 创建支付记录 // 创建支付记录
$this->app->db->name('DataPaymentItem')->insert([ $this->app->db->name('DataPaymentItem')->insert([
'order_no' => $orderNo, 'order_name' => $payTitle, 'order_amount' => $payAmount, 'payment_type' => static::$type, 'order_no' => $orderNo, 'order_name' => $payTitle, 'order_amount' => $payAmount,
'payment_id' => static::$id, 'payment_type' => static::$type,
]); ]);
// 返回支付参数 // 返回支付参数
return $this->payment->jsapiParams($info['prepay_id']); return $this->payment->jsapiParams($info['prepay_id']);
@ -106,20 +108,25 @@ class WechatPaymentService extends PaymentService
*/ */
public function notify(string $type = ''): string public function notify(string $type = ''): string
{ {
$type = $type ?: static::$type; if (is_numeric(stripos($type, '_'))) {
[$payType, $payId] = explode('_', $type);
} else {
[$payType, $payId] = [$type ?: static::$type, static::$id];
}
$notify = $this->payment->getNotify(); $notify = $this->payment->getNotify();
if ($notify['result_code'] == 'SUCCESS' && $notify['return_code'] == 'SUCCESS') { if ($notify['result_code'] == 'SUCCESS' && $notify['return_code'] == 'SUCCESS') {
// 更新支付记录 // 更新支付记录
data_save('DataPaymentItem', [ data_save('DataPaymentItem', [
'order_no' => $notify['out_trade_no'], 'order_no' => $notify['out_trade_no'],
'payment_type' => $type, 'payment_id' => $payId,
'payment_type' => $payType,
'payment_code' => $notify['transaction_id'], 'payment_code' => $notify['transaction_id'],
'payment_amount' => $notify['cash_fee'] / 100, 'payment_amount' => $notify['cash_fee'] / 100,
'payment_status' => 1, 'payment_status' => 1,
'payment_datatime' => date('Y-m-d H:i:s'), 'payment_datatime' => date('Y-m-d H:i:s'),
], 'order_no', ['payment_type' => $type, 'payment_status' => 0]); ], 'order_no', ['payment_type' => $payType, 'payment_status' => 0]);
// 更新记录状态 // 更新记录状态
if ($this->updateOrder($notify['out_trade_no'], $notify['transaction_id'], $notify['cash_fee'] / 100, $type)) { if ($this->updateOrder($notify['out_trade_no'], $notify['transaction_id'], $notify['cash_fee'] / 100, $payType)) {
return $this->payment->getNotifySuccessReply(); return $this->payment->getNotifySuccessReply();
} }
} else { } else {