springboot实现微信公众号支付

springboot简单实现微信公众号支付

支付dome微信公众号支付zip包
微信测试号获取方法:https://blog.youkuaiyun.com/Lc_2018/article/details/88353526
微信支付流程:
在这里插入图片描述
详细请去参考微信公众号支付API文档
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
代码如下:

package com.example.wxpay.api;

import com.example.wxpay.sdk.WXPayUtil;
import com.example.wxpay.utils.HttpCertClientUtils;
import com.example.wxpay.utils.HttpClientUtils;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: Administrator
 * @Date: 2019/12/23 16:03
 */
public class WXPayUtils {
   
   

    /**
     * 微信统一下单接口
     * @param notify_url     回调地址
     * @param out_trade_no   商户订单号
     * @param total_fee      订单总金额
     * @param ip             IP
     * @param body           商品内容描述
     * @param openid         微信用户 OPENID
     * @return
     * @throws Exception
     */
    public Map<String, String> wxPay(String notify_url, String out_trade_no, String total_fee, String ip, String body, String openid) throws Exception {
   
   
        Map<String, String> mp = new HashMap();
        mp.put("appid", WXPayConfig.getAppID());                        // 公众账号ID
        mp.put("mch_id", WXPayConfig.getMchID());                       // 商户号
        mp.put("nonce_str", WXPayUtil.generateNonceStr());              // 随机字符串
        mp.put("body", body);                                           // 商品描述
        mp.put("out_trade_no", out_trade_no);                           // 商户订单号
        mp.put("total_fee", total_fee);                                 // 订单总金额, 单位为分
        mp.put("spbill_create_ip", ip);                                 // 终端IP
        mp.put("notify_url", notify_url);                               // 异步接收微信支付结果通知的回调地址, 通知url必须为外网可访问的url, 不能携带参数
        mp.put("openid",openid);                                        //用户唯一标识
        mp.put("trade_type", "JSAPI");                                 // 交易类型(JSAPI公众号支付/NATIVE扫码支付/APP支付)
        mp.put("product_id", out_trade_no);                             // trade_type=NATIVE时(即扫码支付), 此参数必传. 此参数为二维码中包含的商品ID, 商户自行定义。

        String sign = WXPayUtil.generateSignature(mp, WXPayConfig.getKey());

        StringBuilder sb = new StringBuilder();
        sb.append("<xml>");
        sb.append("<appid>" + mp.get("appid") + "</appid>");
        sb.append("<mch_id><![CDATA[" + mp.get("mch_id") + "]]></mch_id>");
        sb.append("<nonce_str><![CDATA[" + mp.get("nonce_str") + "]]></nonce_str>");
        sb.append("<body><![CDATA[" + mp.get("body") + "]]></body>");
        sb.append("<out_trade_no><![CDATA[" + mp.get("out_trade_no") + "]]></out_trade_no>");
        sb.append("<total_fee>" + mp.get("total_fee") + "</total_fee>");
        sb.append("<spbill_create_ip><![CDATA[" + mp.get("spbill_create_ip") + "]]></spbill_create_ip>");
        sb.append("<notify_url><![CDATA[" + mp.get("notify_url") + "]]></notify_url>");
        sb.append("<openid><![CDATA["+mp.get("openid")+"]]></openid>");
        sb.append("<trade_type><![CDATA[" + mp.get("trade_type") + "]]></trade_type>");
        sb.append("<product_id><![CDATA[" + mp.get("product_id") + "]]></product_id>");
        sb.append("<sign><![CDATA[" + sign + "]]></sign>");
        sb.append("</xml>");

        String url = "https://api.mch.weixin.qq.com/sandboxnew/pay/unifiedorder";
        String str = HttpClientUtils.post(url, sb.toString());

        Map<String, String> retmap = new HashMap();
        try {
   
   
            retmap = WXPayUtil.xmlToMap(str);
        } catch (Exception e) {
   
   
            e.printStackTrace();
        }
        return retmap;
    }
    /**
     * 微信查询
     * @param out_trade_no    商户订单号
     * @return
     * @throws Exception
     */
    public Map<String, String> wxOrderQuery(String out_trade_no) throws Exception {
   
   
        Map<String, String> mp = new HashMap<>();
        mp.put("appid", WXPayConfig.getAppID());                                // 公众账号ID
        mp.put("mch_id", WXPayConfig.getMchID());                               // 商户号
        // mp.put("transaction_id", transaction_id);                            // 微信订单号 (2 S 1)
        mp.put("out_trade_no", out_trade_no);                                   // 商户订单号 (2 S 1)
        mp.put("nonce_str", WXPayUtil.generateNonceStr());                      // 随机字符串
        String sign = WXPayUtil.generateSignature(mp, WXPayConfig.getKey());

        StringBuilder sb = new StringBuilder();
        sb.append("<xml>");
        sb.append("<appid>" + mp.get("appid") + "</appid>");
        sb.append("<mch_id><![CDATA[" + mp.get("mch_id") + "]]></mch_id>");
        sb.append("<out_trade_no><![CDATA[" + mp.get("out_trade_no") + "]]></out_trade_no>");
        sb.append("<nonce_str>" + mp.get("nonce_str") + "</nonce_str>");
        sb.append("<sign><![CDATA[" + sign + "]]></sign>");
        sb.append("</xml>");

        String url = "https://api.mch.weixin.qq.com/pay/orderquery";
        String str = HttpClientUtils.post(url, sb.toString());

        Map<String, String> retmap = new HashMap<>();
        try {
   
   
            retmap = WXPayUtil.xmlToMap(str);
        } catch (Exception e) {
   
   
            e.printStackTrace();
        }
        return retmap;
    }
//    订单关闭
    public Map<String, String> wxPayClose(String out_trade_no) throws Exception {
   
   
        Map<String, String> mp = new HashMap<>();
        mp.put("appid", WXPayConfig.getAppID());                                // 公众账号ID
        mp.put("mch_id", WXPayConfig.getMchID());                               // 商户号
        mp.put("out_trade_no", out_trade_no);                                   // 商户订单号 (2 S 1)
        mp.put("nonce_str", WXPayUtil.generateNonceStr());                      // 随机字符串
        String sign = WXPayUtil.generateSignature(mp, WXPayConfig.getKey());

        StringBuilder sb = new StringBuilder();
        sb.append("<xml>");
        sb.append("<appid>" + mp.get("appid") + "</appid>");
        sb.append("<mch_id><![CDATA[" + mp.get("mch_id") + "]]></mch_id>");
        sb.append("<nonce_str>" + mp.get("nonce_str") + "</nonce_str>");
        sb.append("<out_trade_no><![CDATA[" + mp.get("out_trade_no") + "]]></out_trade_no>");
        sb.append("<sign><![CDATA[" + sign + "]]></sign>");
        sb.append("</xml>");

        String url = "https://api.mch.weixin.qq.com/pay/closeorder";
        String str = HttpClientUtils.post(url, sb.toString());

        Map<String, String> retmap = new HashMap<>();
        try {
   
   
            retmap = WXPayUtil.xmlToMap(str);
        } catch (Exception e) {
   
   
            e.printStackTrace();
        }
        return retmap;

    }

    /**
     * 查询退款
     * @param out_trade_no   商户订单号
     * @return
     * @throws Exception
     */
    public Map<String, String> wxRefundQuery(String out_trade_no) throws Exception {
   
   
        Map<String, String> mp = new HashMap<>();
        mp.put("appid", WXPayConfig.getAppID());                                // 公众账号ID
        mp.put("mch_id", WXPayConfig.getMchID());                               // 商户号
        mp.put("nonce_str", WXPayUtil.generateNonceStr());                      // 随机字符串
        // mp.put("transaction_id", transaction_id);                            // 微信订单号 (4 S 1)
        // mp.put("out_refund_no", out_refund_no);                              // 商户退款单号 (4 S 1)
        // mp.put("refund_id", refund_id);                                      // 微信退款单号 (4 S 1)
        mp.put("out_trade_no", out_trade_no);                                   // 商户订单号 (4 S 1)
        String sign = WXPayUtil.generateSignature(mp, WXPayConfig.getKey());

        StringBuilder sb = new StringBuilder();
        sb.append("<xml>");
        sb.append("<appid>" + mp.get("appid") + "</appid>");
        sb.append("<mch_id><![CDATA[" + mp.get("mch_id") + "]]></mch_id>");
        sb.append("<nonce_str>" + mp.get("nonce_str") + "</nonce_str>");
        sb.append("<out_trade_no><![CDATA[" + mp.get("out_trade_no") + "]]></out_trade_no>");
        sb.append("<sign><![CDATA[" + sign + "]]></sign>");
        sb.append("</xml>");

        String url = "https://api.mch.weixin.qq.com/pay/refundquery";
        String str = HttpClientUtils.post(url, sb.toString());

        Map<String, String> retmap = new HashMap<>();
        try {
   
   
            retmap = WXPayUtil.xmlToMap(str);
        } catch (Exception e) {
   
   
            e.printStackTrace();
        }
        return retmap;
    }













    //h5pay


}
package com.example.wxpay
### UniApp 集成 Java 后端实现微信公众号支付 #### 前提条件 确保已配置好Java后端环境并引入必要的依赖项。对于Spring Boot项目,可以通过Maven或Gradle来管理依赖,这相当于将微信官方提供的库导入到本地环境中[^2]。 #### 准备工作 1. **微信公众平台设置** - 注册成为开发者,并创建相应的应用。 - 获取`appid`, `secret`以及其他必要参数用于后续开发。 2. **服务器准备** - 确认服务器能够接收来自微信服务器的通知请求。 - 设置域名白名单以及回调URL等信息。 #### 开发步骤 ##### uniApp前端部分 ###### 发起支付请求前的操作 在发起支付之前,先通过uni.request()向自己的服务端发送请求获取签名所需的数据包: ```javascript // 调用接口获取预支付交易会话标识 async function getPrepayId(orderInfo) { const res = await uni.request({ url: 'http://yourserver/getprepayid', // 替换成实际的服务端地址 method: "POST", data: orderInfo, header: {'content-type': 'application/json'} }); return res.data; } ``` ###### 处理返回数据并调用微信JS-SDK完成支付 收到服务端响应后,解析其中的内容并通过wx.chooseWXPay方法启动支付流程: ```javascript function startPayment(prepayData){ wx.config({ ... }); // 初始化config wx.ready(function(){ wx.chooseWXPay({ timestamp : prepayData.timeStamp, // 支付签名时间戳 nonceStr : prepayData.nonceStr, // 支付签名随机串 package : prepayData.packageValue, // 统一订单号 signType : prepayData.signType || 'MD5',// 微信签名方式,默认为'MD5' paySign : prepayData.paySign, // 支付签名 success(res){ /* 成功后的处理 */ }, fail(err){ /* 错误处理 */} }) }); wx.error(function (res) { console.log('config info:' + JSON.stringify(res));}); } ``` 以上代码片段展示了如何利用uniApp框架中的API与微信JS-SDK交互以执行支付操作[^1]。 ##### Java(SpringBoot)后端部分 为了简化说明,在此仅展示核心逻辑而不涉及具体业务细节。假设存在一个名为WeChatService的服务类负责处理所有关于微信支付的任务。 ###### 创建统一下单接口 定义一个HTTP POST映射路径供前端调用来生成预支付ID(`prepay_id`)和其他必需的信息。 ```java @RestController @RequestMapping("/wechat") public class WechatController { @Autowired private WeChatService weChatService; @PostMapping("/getprepayid") public ResponseEntity<UnifiedOrderResult> createOrder(@RequestBody OrderRequest request) throws Exception{ UnifiedOrderResult result = this.weChatService.createUnifiedOrder(request); return new ResponseEntity<>(result, HttpStatus.OK); } } ``` ###### 实现具体的下单过程 该函数内部实现调用微信支付API的过程,包括但不限于组装请求体、计算签名值等动作。 ```java @Service class WeChatServiceImpl implements WeChatService{ @Override public UnifiedOrderResult createUnifiedOrder(OrderRequest req)throws WxPayException{ try { Map<String,String> params=new HashMap<>(); // 构建必填字段... params.put("body",req.getBody()); params.put("out_trade_no",req.getOutTradeNo()); ... String xml=buildXml(params); // 将Map转XML字符串 HttpClient client=new DefaultHttpClient(); HttpPost postMethod=new HttpPost("https://api.mch.weixin.qq.com/pay/unifiedorder"); postMethod.setEntity(new ByteArrayEntity(xml.getBytes())); HttpResponse response=client.execute(postMethod); InputStream inputStream=response.getEntity().getContent(); SAXReader reader=new SAXReader(); Document document=reader.read(inputStream); Element root=document.getRootElement(); UnifiedOrderResult ret=new UnifiedOrderResult(); ret.setCodeUrl(root.elementTextTrim("code_url")); ... return ret; } catch(Exception e){ throw new RuntimeException(e.getMessage(),e.getCause()); } } private static final String buildXml(Map<String ,String > map){ StringBuilder sb=new StringBuilder("<xml>"); for(String key:map.keySet()){ sb.append("<").append(key).append(">").append(map.get(key)).append("</").append(key).append(">\n"); } sb.append("</xml>"); return sb.toString(); } } ``` 上述示例中包含了构建统一订单所需的大部分要素,但请注意实际部署时还需要考虑安全性因素如HTTPS连接验证等问题[^3]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值