苍穹外卖项目笔记(10)——模拟微信支付

文章讲述了如何在个人项目中使用微信支付,通过修改后端接口和前端代码,绕过微信官方支付接口,直接更新订单状态,并在微信小程序中实现支付成功后的回调功能。

前言

视频中的微信支付需要商家认证才能开通,个人做项目只能模拟支付。
思路:
首先,用户点击支付,
其次,后端接收到请求,绕过微信支付接口,直接更新订单状态。
最后,微信小程序前端直接回调支付成功页面 。

链接: 黑马程序员苍穹外卖项目视频

一、微信支付

1.修改 orderServiceImpl的payment 方法跳过调用微信支付接口

修改orderServiceImpl的payment 方法跳过调用微信支付接口

将原本的调用支付接口注销,并生成空jsonObject

        //调用微信支付接口,生成预支付交易单
//        JSONObject jsonObject = weChatPayUtil.pay(
//                ordersPaymentDTO.getOrderNumber(), //商户订单号
//                new BigDecimal(0.01), //支付金额,单位 元
//                
在“苍穹外卖”应用中模拟实现微信支付功能,需要结合项目架构中的系统管理后台和小程序端应用,完成支付流程的前后端交互。微信支付的集成通常包括以下核心步骤:调用微信支付接口生成预支付交易单、前端调起微信支付、后端处理支付结果回调、更新订单状态等。 ### 后端接口设计 1. **生成预支付交易单** 后端需调用微信支付的统一下单接口(`unifiedorder`),获取预支付交易单信息。该接口需要商户私钥签名,并返回`prepay_id`,用于前端调起微信支付。 ```java // 示例代码:调用微信统一下单接口 public String generatePrepayOrder(String orderId, BigDecimal totalAmount) { String url = "https://api.mch.weixin.qq.com/pay/unifiedorder"; // 构造请求参数 Map<String, String> params = new HashMap<>(); params.put("appid", "your_appid"); params.put("mch_id", "your_mch_id"); params.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", "")); params.put("body", "苍穹外卖订单"); params.put("out_trade_no", orderId); params.put("total_fee", totalAmount.multiply(new BigDecimal(100)).intValueExact() + ""); params.put("spbill_create_ip", "用户端IP"); params.put("notify_url", "支付回调地址"); params.put("trade_type", "JSAPI"); // 签名 String sign = generateSign(params, "your_private_key"); params.put("sign", sign); // 发送请求并解析返回结果 String xmlResponse = HttpUtil.post(url, MapToXml(params)); return parsePrepayId(xmlResponse); } ``` 2. **处理微信支付回调通知** 微信支付完成后,会通过异步回调通知商户服务器支付结果。后端需验证签名并解析支付结果,更新订单状态。 ```java @PostMapping("/wechat/notify") public String handleWeChatPaymentNotify(@RequestBody Map<String, String> notifyData) { String returnCode = notifyData.get("return_code"); if ("SUCCESS".equals(returnCode)) { String transactionId = notifyData.get("transaction_id"); String orderId = notifyData.get("out_trade_no"); // 验证签名 if (verifySign(notifyData)) { // 更新订单状态为已支付 orderService.updateOrderStatusToPaid(orderId); return "<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>"; } } return "<xml><return_code><![CDATA[FAIL]]></return_code></xml>"; } ``` ### 前端调起微信支付 在小程序端,使用微信小程序的`wx.requestPayment`方法调起支付界面。需要传入从后端获取的`prepay_id`及签名信息。 ```javascript // 调用后端接口获取预支付信息 wx.request({ url: 'https://yourdomain.com/api/wechat/prepay', method: 'POST', data: { orderId: '123456' }, success(res) { const { timeStamp, nonceStr, package, signType, paySign } = res.data; wx.requestPayment({ timeStamp: timeStamp, nonceStr: nonceStr, package: package, signType: signType, paySign: paySign, success(payRes) { console.log("支付成功"); // 跳转至订单详情页 wx.navigateTo({ url: '/pages/orderDetail/orderDetail?orderId=' + orderId }); }, fail(payErr) { console.error("支付失败", payErr); } }); } }); ``` ### 模拟支付流程(无真实商户号) 若不具备微信支付商户号,可采用模拟支付方式实现前端交互。在后端模拟返回预支付信息,前端调用模拟支付成功的方法,跳转至支付成功页面。 ```java // 模拟生成预支付信息 @GetMapping("/mock/prepay") public Map<String, String> mockGeneratePrepayOrder(String orderId) { Map<String, String> response = new HashMap<>(); response.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); response.put("nonceStr", UUID.randomUUID().toString().replaceAll("-", "")); response.put("package", "prepay_id=wx26160922189732ac8efd8d5b9d123456"); response.put("signType", "MD5"); response.put("paySign", "mock_sign"); return response; } ``` ### 数据库订单状态更新 支付成功后,后端应更新订单状态为“已支付”,并记录支付时间和交易流水号。数据库表`orders`中可新增字段如`payment_status`、`payment_time`、`transaction_id`等。 ```sql ALTER TABLE orders ADD COLUMN payment_status ENUM('UNPAID', 'PAID') DEFAULT 'UNPAID', ADD COLUMN payment_time DATETIME, ADD COLUMN transaction_id VARCHAR(64); ``` ### 微信支付集成注意事项 - **签名验证**:所有与微信支付交互的请求必须携带签名,防止请求被篡改。 - **回调安全性**:确保支付回调接口具备签名验证机制,防止伪造支付结果。 - **测试环境**:可使用微信支付提供的沙箱环境进行测试,确保接口逻辑正确。 - **异常处理**:支付过程中可能出现网络异常、超时等情况,需加入重试机制和日志记录。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值