SpringBoot对接微信小程序支付功能开发(二,支付回调功能)

2023-11-06

接着上一篇: SpringBoot对接微信小程序支付功能开发(一,下单功能)

在上一篇下单功能中我们有传支付结果回调地址。
在这里插入图片描述
下面是回调接口实现

package com.office.miniapp.controller;


import cn.hutool.core.date.DateTime;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.office.miniapp.constants.ProjectConstant;
import com.office.miniapp.entity.TdOrders;
import com.office.miniapp.entity.TdShops;
import com.office.miniapp.entity.TdWxPay;
import com.office.miniapp.service.TdOrdersService;
import com.office.miniapp.service.TdShopsService;
import com.office.miniapp.service.TdWxPayService;
import com.office.miniapp.utils.HttpClientUtil;
import com.office.miniapp.utils.WxPayUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * <p>
 * 支付表 前端控制器
 * </p>
 *
 * @author XQD
 * @since 2022-08-13
 */
@Slf4j
@RestController
@RequestMapping("/wxPay")
public class TdWxPayController extends BaseController {

    @PostMapping("/callback")
    public Object callback(HttpServletRequest request) {
        log.info("【支付回调】");
        System.out.println("Wechatpay-Timestamp:" + request.getHeader("Wechatpay-Timestamp"));
        System.out.println("Wechatpay-Nonce:" + request.getHeader("Wechatpay-Nonce"));
        System.out.println("Wechatpay-Signature:" + request.getHeader("Wechatpay-Signature"));
        System.out.println("Wechatpay-Serial:" + request.getHeader("Wechatpay-Serial"));
        Map result = new HashMap();
        result.put("code", "FAIL");
        try {
            StringBuilder signStr = new StringBuilder();
            // 应答时间戳\n
            signStr.append(request.getHeaders("Wechatpay-Timestamp")).append("\n");
            // 应答随机串\n
            signStr.append(request.getHeaders("Wechatpay-Nonce")).append("\n");
            // 应答报文主体\n
            BufferedReader br = request.getReader();
            String str = null;
            StringBuilder builder = new StringBuilder();
            while ((str = br.readLine()) != null) {
                builder.append(str);
            }
            System.out.println("支付应答报文主体:" + builder);
            signStr.append(builder.toString()).append("\n");
            // 第一步:验证签名
            if (WxPayUtil.signVerify(request.getHeader("Wechatpay-Serial"), signStr.toString(), request.getHeader("Wechatpay-Signature"))) {
                result.put("message", "sign error");
                return result;
            }
            // 第二步:解密密文
            String decryptOrder = WxPayUtil.decryptOrder(builder.toString());
            System.out.println("解密后支付信息:" + decryptOrder);
            JSONObject jsonObject = JSON.parseObject(decryptOrder);
            //String transactionId = jsonObject.getString("transaction_id");
            //String appid= jsonObject.getString("appid");
            //String successTime = new DateTime(jsonObject.getString("success_time")).toString();
            //JSONObject jsonPayer = JSON.parseObject(jsonObject.getString("payer"));
            //String openid= jsonPayer.getString("openid");
            //解密后的支付信息存入数据库...
            //第三步:验证订单,解密后的订单信息和自己数据库中的订单信息进行比对
            //金额对比  orders.getAmount()为数据库中的订单金额
            if (orders.getAmount().equals(jsonAmout.getInteger("total"))) {
                if ("SUCCESS".equals(jsonObject.getString("trade_state"))) {
                     // 支付成功...
                     //根据支付信息查询已存的订单信息,进行状态改变等操作,根据业务操作
                    }
               }
            result.put("code", "SUCCESS");
            result.put("message", "成功");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }
}

根据官网给的参数进行业务处理

在这里插入图片描述

这就完成了,微信支付回调你的地址,并且把支付的信息传进来,剩下就要根据自己业务进行操作。
注意:
1,验证签名和解密的操作在上一篇下单功能的文章中的WxPayUtil 中
2,这个地址必须为线上地址,https前缀的域名+/wxPay/callback。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot对接微信小程序支付功能开发(二,支付回调功能) 的相关文章

随机推荐