{{userInfo.nickname}}
用户设置 退出登录

{{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.like_num}}人点赞
0人点赞
评论({{cateWiki.comment_num}}) {{commentWhere.order ? '评论从旧到新':'评论从新到旧'}} {{cateWiki.page_view_num}}人看过该文档
评论(0) {{commentWhere.order ? '评论从旧到新':'评论从新到旧'}} 383人看过该文档
评论
{{item.user ? item.user.nickname : ''}} (自评)
{{item.content}}
{{item.create_time}} 删除
{{item.like ? item.like.like_num : 0}} {{replyIndex == index ? '取消回复' : '回复'}}
评论
{{items.user ? items.user.nickname : '暂无昵称'}} (自评)
{{items.content}}
{{items.create_time}} 删除
{{items.like ? items.like.like_num : 0}} {{replyIndexJ == (index+'|'+indexJ) ? '取消回复' : '回复'}}
评论
目录
  • {{item}}