当使用手机支付宝扫码之后,支付宝会解析二维码中的网址,向我们的服务器发起请求;此时拿到请求携带的订单编号,查询支付记录;如果已支付则直接返回,否则拼接参数向支付宝发起支付请求,支付宝会返回一个form表单页面,用于拉取支付宝手机支付。

接口信息

路径地址 http://localhost:63020/orders/requestpay
请求方式 GET
请求参数 String
返回结果

支付记录Service

根据订单编号查询支付记录

com.swx.orders.service包下的 XcPayRecordService 中定义查询支付记录方法:

XcPayRecordService
public interface XcPayRecordService extends IService<XcPayRecord> {

/**
* 根据交易编号查询记录
*
* @param payNo 交易编号
* @return com.swx.orders.model.po.XcPayRecord 支付记录
*/
XcPayRecord getOneByPayNo(String payNo);
}

在实现类中实现该方法

XcPayRecordServiceImpl
/**
* <p>
* 服务实现类
* </p>
*
* @author sw-code
* @since 2023-09-04
*/
@Service
public class XcPayRecordServiceImpl extends ServiceImpl<XcPayRecordMapper, XcPayRecord> implements XcPayRecordService {

/**
* 根据交易编号查询记录
*
* @param payNo 交易编号
* @return com.swx.orders.model.po.XcPayRecord 支付记录
*/
@Override
public XcPayRecord getOneByPayNo(String payNo) {
return getOne(Wrappers.<XcPayRecord>lambdaQuery().eq(XcPayRecord::getPayNo, payNo));
}
}

扫码下单Controller

OrderController
@ApiOperation("扫码下单接口")
@RequestMapping("/requestpay")
public void requestPay(String payNo, HttpServletResponse httpResponse) throws IOException {
// 判断支付记录号是否存在
XcPayRecord xcPayRecord = xcPayRecordService.getOneByPayNo(payNo);
if (xcPayRecord == null) {
throw new BizException("支付记录不存在");
}
if (xcPayRecord.getStatus().equals("601002")) {
// 该支付记录已成功支付
throw new BizException("已支付,无需重复支付");
}
// 发起支付请求
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, APP_ID, APP_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
// 异步接收地址,仅支持http/https,公网可访问
request.setNotifyUrl(NOTIFY_URL);
/******必传参数******/
JSONObject bizContent = new JSONObject();
//商户订单号,商家自定义,保持唯一性
bizContent.put("out_trade_no", payNo);
//支付金额,最小值0.01元
bizContent.put("total_amount", xcPayRecord.getTotalPrice());
//订单标题,不可使用特殊符号
bizContent.put("subject", xcPayRecord.getOrderName());

/******可选参数******/
//手机网站支付默认传值FAST_INSTANT_TRADE_PAY
bizContent.put("product_code", "QUICK_WAP_WAY");

request.setBizContent(bizContent.toString());
String form = "";
try {
form = alipayClient.pageExecute(request).getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
throw new BizException("拉取支付宝支付失败");
}
httpResponse.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
httpResponse.getWriter().write(form);
httpResponse.getWriter().flush();
}