Java对接微信支付(史上最详细)

这篇具有很好参考价值的文章主要介绍了Java对接微信支付(史上最详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java对接微信支付(史上最详细)

本文将介绍如何使用Java对接微信支付,包括获取支付参数、支付回调处理等步骤。本文适用于已经熟悉微信支付基本原理的读者。

开发环境

  • JDK 1.8
  • Maven
  • Spring Boot 2.x
  • 微信支付开发文档

第一步:获取支付参数

为了进行支付,我们需要先获取微信支付的参数信息,包括appid、商户id、支付密钥等。

配置文件

我们可以将这些参数信息放在一个配置文件中,以便后续使用。在Spring Boot中,可以通过application.yml或者application.properties文件配置。

wechat:
  appid: xxx # 微信公众号appid
  mchid: xxx # 商户id
  key: xxx # 支付密钥
  notifyUrl: xxx # 支付回调地址

获取签名

获取到参数信息后,我们需要对其进行签名,以确保支付安全性。签名算法具体可以参考微信官方文档。

public static String sign(Map<String, String> params, String key) {
    String signStr = SignUtil.createLinkString(params) + "&key=" + key;
    return MD5Util.md5(signStr).toUpperCase();
}

其中,createLinkString方法用于将参数按照字典序拼接为一个字符串,MD5Util.md5方法用于生成MD5签名,toUpperCase方法用于将签名转换成大写。

第二步:生成支付参数

获取到签名后,我们需要根据支付金额、订单号等信息生成一个可以供客户端调用的支付参数。

统一下单接口

我们可以通过微信提供的统一下单接口生成支付参数。

public static Map<String, String> unifiedOrder(String appid, String mchId, String key, String body, String outTradeNo, int totalFee, String spBillCreateIp, String notifyUrl, String tradeType, String openid) throws Exception {
    Map<String, String> params = new HashMap<>();
    params.put("appid", appid);
    params.put("mch_id", mchId);
    params.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", ""));
    params.put("body", body);
    params.put("out_trade_no", outTradeNo);
    params.put("total_fee", String.valueOf(totalFee));
    params.put("spbill_create_ip", spBillCreateIp);
    params.put("notify_url", notifyUrl);
    params.put("trade_type", tradeType);
    params.put("openid", openid);
    params.put("sign", SignUtil.sign(params, key));
    String xml = HttpUtil.post(UNIFIED_ORDER_URL, XmlUtil.mapToXml(params));
    Map<String, String> result = XmlUtil.xmlToMap(xml);
    if ("SUCCESS".equals(result.get("return_code")) && "SUCCESS".equals(result.get("result_code"))) {
        return result;
    } else {
        throw new Exception(result.get("return_msg"));
    }
}

其中,UNIFIED_ORDER_URL为统一下单接口地址。HttpUtil.post方法用于发送POST请求并获取响应结果,XmlUtil.mapToXml和XmlUtil.xmlToMap方法用于将Map对象和XML字符串互相转换。

生成支付参数

统一下单接口返回的结果中包含了prepay_id,我们需要将其作为参数再次签名生成支付参数。

public static String createPayParams(String appId, String prepayId, String key) {
    Map<String, String> params = new HashMap<>();
    params.put("appId", appId);
    params.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
    params.put("nonceStr", UUID.randomUUID().toString().replaceAll("-", ""));
    params.put("package", "prepay_id=" + prepayId);
    params.put("signType", "MD5");
    params.put("paySign", SignUtil.sign(params, key));
    return JsonUtil.toJson(params);
}

其中,JsonUtil.toJson方法用于将Map对象转换成JSON字符串。

第三步:处理支付回调

当客户端支付完成后,微信会回调我们预先设置的支付回调地址,我们需要在该地址上接收并处理回调信息。

支付回调接口

我们可以将支付回调信息封装成一个实体类,用于接收并处理回调信息。

@Data
public class PayNotify {
    private String return_code;
    private String return_msg;
    private String appid;
    private String mch_id;
    private String nonce_str;
    private String sign;
    private String result_code;
    private String openid;
    private String trade_type;
    private String bank_type;
    private Integer total_fee;
    private String fee_type;
    private String transaction_id;
    private String out_trade_no;
    private String attach;
    private String time_end;
}

处理支付结果

接收到支付回调信息后,我们需要校验签名并处理支付结果。

@PostMapping("/pay/notify")
public String payNotify(@RequestBody PayNotify payNotify) {
    Map<String, String> params = new HashMap<>();
    params.put("appid", payNotify.getAppid());
    params.put("mch_id", payNotify.getMch_id());
    params.put("nonce_str", payNotify.getNonce_str());
    params.put("result_code", payNotify.getResult_code());
    params.put("openid", payNotify.getOpenid());
    params.put("trade_type", payNotify.getTrade_type());
    params.put("bank_type", payNotify.getBank_type());
    params.put("total_fee", payNotify.getTotal_fee().toString());
    params.put("fee_type", payNotify.getFee_type());
    params.put("transaction_id", payNotify.getTransaction_id());
    params.put("out_trade_no", payNotify.getOut_trade_no());
    params.put("attach", payNotify.getAttach());
    params.put("time_end", payNotify.getTime_end());
    String sign = SignUtil.sign(params, key);
    if (!sign.equals(payNotify.getSign())) {
        return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名错误]]></return_msg></xml>";
    }
    // 处理支付结果
    return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
}

其中,key为支付密钥。

总结

本文介绍了使用Java对接微信支付的步骤,包括获取支付参数、生成支付参数、处理支付回调等。希望对大家有所帮助。文章来源地址https://www.toymoban.com/news/detail-616587.html

到了这里,关于Java对接微信支付(史上最详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序支付-java对接微信

     一共是两个方法: 一个方法后台生成预支付订单,得到预支付交易会话标识prepay_id,传给前端,让前端调起小程序支付; 一个是支付回调 目录 一、生成预支付订单  注意: 二、 支付回调         封装参数向微信发送生成预支付交易单请求,微信会返回一个prepay_id,再将

    2024年02月12日
    浏览(33)
  • java对接微信支付:JSAPI支付成功之“微信回调”

    承接上一篇微信支付,现在简单说一下 微信支付回调 目录 一、支付回调 二、微信回调地址问题 1.本地/上线测试 2.控制器调用接口(代码) 总结 当用户支付成功之后,支付平台会向我们指定的服务器接口发送请求传递订单支付状态数据 如果你是再本地进行测试,那就需要使用

    2024年02月12日
    浏览(28)
  • java对接微信支付api3心得(小白易懂)

            公司做的项目中,需要支付功能,因为做的微信小程序项目,所以直接就用微信支付了,以前我也对接过微信支付,但以前没有java的sdk,并且还是用的xml报文,我们还得解析xml才行,所以麻烦的很,这次对接突然发现,微信已经提供了好多中语言的sdk,其中也包

    2024年02月03日
    浏览(34)
  • weixin-java-pay对接微信V3支付记录

    https://github.com/binarywang/weixin-java-pay-demo 这个demo里, 没有v3版本的配置, 这里记录一下 v3支付, 相对之前的版本来说, 更为安全, 也相对繁琐一些, 而且请求和响应都使用了json格式的数据 1. 配置 发起支付所需的配置有三个证书文件, 在商户后台申请 apiclient_cert.p12 apiclient_key.pem ap

    2024年02月11日
    浏览(37)
  • 对接微信支付接口

    https://pay.weixin.qq.com/wiki/doc/api/index.html 1.准备工作: 在微信上申请服务号类型的公众号,从公众号获取以下数据 appid:微信公众账号或开放平台APP的唯一标识 mch_id:商户号 (配置文件中的partner) partnerkey:商户密钥 2. 根据项目需求选择适合的支付方式,本例使用Native支付方式

    2024年02月13日
    浏览(41)
  • JAVA开发(史上最完整追本溯源JAVA历史、发展和学习)

    (第二次世界大战1931-1945) 世界上最先进的技术往往是由于战争催生,在第二次世界大战中除了飞机,坦克和大炮的武器较量外,在隐秘战线的情报工作其实更为重要,在军队将领来往的电报中,为了防止军事情报的泄漏,不得不将电报进行加密传输。第二次世界大战,德国使

    2024年01月20日
    浏览(30)
  • 【微信支付】java-微信小程序支付-V3接口

    最开始需要在微信支付的官网注册一个商户; 在管理页面中申请关联小程序,通过小程序的 appid 进行关联;商户号和appid之间是多对多的关系 进入微信公众平台,功能-微信支付中确认关联 具体流程请浏览官方文档:接入前准备-小程序支付 | 微信支付商户平台文档中心 流程走

    2024年02月06日
    浏览(41)
  • Java集成建行龙支付接口(详细)

    目录 一、准备工作 二、开始对接 三、总结 一、准备工作 1. 获取建行龙支付对接文档( 注意:建行会给指定邮箱发送16个rar的压缩包 )都下载完才能获取到完整文档,解压完可以看到名为“ 建行龙支付接入指南V1.32 ”的文件夹,里面的内容为 6个文件夹1个pdf文档 。 2. 获取

    2024年02月09日
    浏览(38)
  • Java 微信小程序-发货信息录入接口 对接代码

    微信小程序-发货信息录入接口开发文档 POST https://api.weixin.qq.com/wxa/sec/order/upload_shipping_info?access_token=ACCESS_TOKEN 参见「查询物流公司编码列表」对接代码

    2024年02月03日
    浏览(57)
  • 微信小程序对接微信支付详细教程

    小程序 微信支付官方文档 https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_11index=2 https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_0.shtml 前提 在进行对接微信支付之前,我们首先需要将以下几点准备好: 申请APPID 申请商户号 小程序开通微信支付,绑定已经申请好的商户号。

    2024年02月09日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包