{{wikiTitle}}
支付
目录:
一、功能概述
本模块实现多支付渠道订单支付功能;
支持微信支付(公众号/小程序/H5/APP)、支付宝支付(H5/APP)及余额支付。核心流程包括:
1.订单状态校验 → 2. 支付方式动态切换 → 3. 支付参数构造 → 4. 第三方支付预下单 → 5. 支付结果处理
二、核心支付流程图
start
:客户端发起支付请求;
if (支付方式=微信) then
:获取OpenID/配置参数;
:调用微信统一下单接口;
:生成JSAPI/H5/APP支付参数;
else if (支付方式=支付宝) then
:构造App/Wap支付请求;
:调用支付宝支付接口;
else if (支付方式=余额) then
:校验用户余额;
:扣减余额更新订单;
endif
:返回前端支付凭据;
stop
三、代码结构说明
1. 控制器层 (OrderPayController)
@ApiOperation(value = "订单支付")
@RequestMapping(value = "/payment", method = RequestMethod.POST)
public CommonResult<OrderPayResultResponse> payment(
@RequestBody @Validated OrderPayRequest orderPayRequest,
HttpServletRequest request) {
String ip = CrmebUtil.getClientIp(request);
return success(orderPayService.payment(orderPayRequest, ip));
}
参数说明:
orderPayRequest:包含订单号、支付类型(微信/支付宝/余额)、支付渠道(公众号/H5等)
ip:客户端IP(用于防刷和支付风控)
2. 服务层核心方法 (OrderPayServiceImpl.payment)
a. 订单基础校验
StoreOrder storeOrder = getByOderId(orderNo);
if (orderDeleted || orderPaid) throw Exception;
校验规则:
订单存在性检查
订单删除状态检查
重复支付检查
b. 支付方式处理
// 微信支付渠道映射
switch(payChannel) {
case H5: storeOrder.setIsChannel(2);
case 公众号: storeOrder.setIsChannel(0);
case 小程序: storeOrder.setIsChannel(1);
// ...其他渠道
}
c. 余额支付处理
if (user.getNowMoney() < orderPrice) throw new CrmebException("余额不足");
boolean success = yuePay(storeOrder); // 扣款&更新订单状态
原子操作:
使用事务保证余额扣减与订单状态更新的原子性
d. 微信支付预下单
Map<String, String> unifiedorder = unifiedorder(storeOrder, ip);
// 构造JSAPI/H5/APP参数
WxPayJsResultVo vo = assembleWxPayParams(unifiedorder);
关键步骤:
获取OpenID(公众号/小程序)
配置商户参数(AppID/MCH_ID等)
调用wechatNewService.payUnifiedorder生成预支付ID
生成前端支付签名
e. 支付宝支付处理
// APP支付
AlipayTradeAppPayRequest appRequest = buildAppPayRequest(order);
// WAP支付
AlipayTradeWapPayRequest wapRequest = buildWapPayRequest(order);
参数构造:
out_trade_no:商户订单号
timeout_express:支付超时时间(30m)
passback_params:回传参数(用于支付回调识别)
四、二开指导
1. 新增支付渠道(例:银联支付)
扩展支付类型枚举
// 在PayConstants中新增
public static final String PAY_TYPE_UNION = "union";
添加支付处理分支
if (PAY_TYPE_UNION.equals(payType)) {
return processUnionPay(storeOrder);
}
实现支付处理器
参照unifiedorder方法实现银联参数构造
调用银联支付API
2. 修改支付超时时间
修改支付宝超时配置
// 原值:"30m"
String timeout_express = "2h";
调整微信订单有效期
// 在getUnifiedorderVo中修改
vo.setTimeExpire("20231010235959");
3. 增加支付渠道开关
新增系统配置项
INSERT INTO system_config (key, value) VALUES (‘pay_union_enable’, ‘0’);
在支付入口添加校验
if ("0".equals(getConfig("pay_union_enable"))){
throw new CrmebException("银联支付暂未开放");
}




评论({{cateWiki.comment_num}})
{{commentWhere.order ? '评论从旧到新':'评论从新到旧'}}
{{cateWiki.page_view_num}}人看过该文档


评论(0)
{{commentWhere.order ? '评论从旧到新':'评论从新到旧'}}
383人看过该文档




{{item.user ? item.user.nickname : ''}} (自评)
{{item.content}}
{{item.create_time}} 删除




搜索结果
为您找到{{wikiCount}}条结果
{{item.page_view_num}}
{{item.like ? item.like.like_num : 0}}
{{item.comment ? item.comment.comment_num : 0}}
位置:{{path.name}} {{(i+1) == item.catalogue.path_data.length ? '':'/'}}


