我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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 params, String key) {    String signStr = SignUtil.createLinkString(params) + "&key=" + key;    return MD5Util.md5(signStr).toUpperCase();}

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

第二步:生成支付参数

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

统一下单接口

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

public static Map unifiedOrder(String appid, String mchId, String key, String body, String outTradeNo, int totalFee, String spBillCreateIp, String notifyUrl, String tradeType, String openid) throws Exception {    Map 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 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 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字符串。

第三步:处理支付回调

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

支付回调接口

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

@Datapublic 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 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 "";    }    // 处理支付结果    return "";}

其中,key为支付密钥。

总结

本文介绍了使用Java对接微信支付的步骤,包括获取支付参数、生成支付参数、处理支付回调等。希望对大家有所帮助。

来源地址:https://blog.csdn.net/Ellis_li/article/details/131010470

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

Java对接微信支付(史上最详细) 本文将介绍如何使用Java对接微信支付,包括获取支付参数、支付回调处理等步骤。本文适用于已经熟悉微信支付基本原理的读者。 开发环境 JDK 1.8MavenSpring Boot 2.x微信支付开发文档
2023-08-17

Java 实现微信支付详细教程

摘要:最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,在做的过程中也遇到些问题,所以现在总结梳理一下,分享给有需要的人,也为自己以后回顾留个思路。 一、微信支付接入准备工作: 首先,微信支付,只支持企业用户,个人用户是不能
2023-08-19

Java后端如何对接微信支付

本篇内容主要讲解“Java后端如何对接微信支付”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java后端如何对接微信支付”吧!首先我们要明确目标,我们点击微信支付官网,我们主要聚焦于这三种支付方
2023-06-22

Android App支付系列(一):微信支付接入详细指南(附官方支付demo)

写在前面 一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统显然是不明智的,国内已经有多家成熟的移动支付提供商,腾讯就是其中之一。梳理了下微信支付的接入,今天给大家分享下腾讯旗下的微信支付SDK的接入流程。 接入流程 1
2022-06-06

Java接入微信支付超级详细教程——从入门到精通

源码下载 源码获取:点击获取源码 本文介绍了“二维码付款”的代码。其他微信支付方式的代码都在源码中。 一、准备开发所需的账号以及配置信息 解释:想要接入微信支付我们需要两个玩意 ,一个是公众号/小程序/企业微信(开发用的),一个是微信支付商
2023-08-17

使用nodejs搭建微信小程序支付接口的详细过程

前段时间做微信支付,遇到了很多坑,网上也没有讲解的特别明白的,通过借鉴各路人才的经验,最后也完成了,下面这篇文章主要给大家介绍了关于使用nodejs搭建微信小程序支付接口的详细过程,需要的朋友可以参考下
2022-12-27

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录