Java实现微信支付功能

article/2025/10/15 8:24:53

微信实现支付功能与支付宝实现支付功能是相似的,接入前的准备工作,包括申请APPID、申请mchid、绑定APPID及mchid、配置API key、下载并配置商户证书等,具体可查看微信支付文档

接入前准备-APP支付 | 微信支付商户平台文档中心 (qq.com)正在上传…重新上传取消https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_5_1.shtmlicon-default.png?t=M5H6https://link.juejin.cn?target=https%3A%2F%2Fpay.weixin.qq.com%2Fwiki%2Fdoc%2Fapiv3%2Fopen%2Fpay%2Fchapter2_5_1.shtml之后需要将APP与微信支付进行绑定,文档如下:

看一下微信支付的流程图:

编辑微信支付的流程,同样与支付宝相似, 微信支付需要调微信生成预付单,然后由客户端发起真正的支付。

支付流程

基于APP支付来说,微信支付的大体流程:
1、APP客户端根据用户支付请求,将订单信息(订单号,金额等)传至后台服务器
2、后台服务器根据订单信息,拼装微信统一下单接口需要的请求参数。其中比较重要的参数为appidmch_idnonce_strsignout_trade_nototal_feenotify_url

这里参数拼装需要根据微信提供的签名算法
假设请求参数为:

"appid":"wxd930ea5d5a258f4f"
"mch_id":"10000100"
"body":"test"
"nonce_str":"ibuaiVcKdpRxkhJA"

需要将以上参数按照规则先拼装成String

  1. key值按照ASCII从小到大排序(A->Z),key=value形式并用&连接
String a = "appid=wxd930ea5d5a258f4f&mch_id=10000100&body=test&nonce_str=ibuaiVcKdpRxkhJA"
  1. 拼接API密钥 key 是商户平台设置的密钥key
signStr = a + "&key=192006250b4c09247ec02edce69f6a2d"
  1. MD5签名(转大写) 注:微信默认为MD5签名,也支持HMAC-SHA256签名方式
sign=MD5(signStr).toUpperCase()

然后sign继续按照规则(A->Z)拼装进String中。
java中可以用map完成排序

Map<String, String> paramsMap = new TreeMap<String, String>(String::compareTo);
paramsMap.put("appid", APP_APP_ID);paramsMap.put("sign",sign);

最后需要将参数转化成xml格式的string进行接口请求

<xml>
<appid>![CDATA[wxd930ea5d5a258f4f]]</appid>
<mch_id>![CDATA[10000100]]</mch_id>
<device_info>![CDATA[1000]]</device_info>
<body>![CDATA[test]]</body>
<nonce_str>![CDATA[ibuaiVcKdpRxkhJA]]</nonce_str>
<sign>![CDATA[9A0A8659F005D6984697E2CA0A9CF3B7]]</sign>
</xml>

微信支付请求参数

Map<String, String> callWeChatPay = new HashMap<>();
// 调用微信统一下单接口
Map<String, String> requestPara = new HashMap<>();
// 公众账号ID
requestPara.put("appid", appid);
// 商户号
requestPara.put("mch_id", mch_id);
// 商品描述
requestPara.put("body", body);
requestPara.put("out_trade_no", tradeNo);
// 总金额
requestPara.put("total_fee", amount.intValue() + "");
// 终端IP
requestPara.put("spbill_create_ip", "127.0.0.1");
// 通知地址
requestPara.put("notify_url", notify_url);
// 交易类型
requestPara.put("trade_type", "APP");
//加密方式
requestPara.put("sign_type", FreePayUtils.MD5);
//标价币种
requestPara.put("fee_type", "CNY");
//订单失效时间
requestPara.put("time_expire", DateUtil.addMinute("", 10, "yyyyMMddHHmmss"));
//签名
String sign = WechatPaykey(微信支付秘钥生成);//parseString2Xml
String xmlData = FreePayUtils.parseString2Xml(requestPara, sign);//调用微信统一下单接口
HttpSupport httpSupport = HttpSupport.makeConnect();
String result = httpSupport.doPostBody("https://api.mch.weixin.qq.com/pay/unifiedorder", xmlData).result();//xmlToMap
Map<String, String> returnMap = FreePayUtils.xmlToMap(result);
String returnCode = returnMap.get("return_code");
String resultCode = returnMap.get("result_code");if ("SUCCESS".equals(returnCode) && "SUCCESS".equals(resultCode)) {String prepayId = returnMap.get("prepay_id");//应用IDcallWeChatPay.put("appid", waistcoat.getWechatAppid());//商户号callWeChatPay.put("partnerid", waistcoat.getWechatMchid());//预支付交易会话IDcallWeChatPay.put("prepayid", prepayId);//扩展字段callWeChatPay.put("package", "Sign=WXPay");callWeChatPay.put("noncestr", FreePayUtils.generateNonceStr());callWeChatPay.put("timestamp", FreePayUtils.getCurrentTimestamp() + "");// 签名String appSign = FreePayUtils.generateSignature(callWeChatPay, waistcoat.getWechatPaykey());callWeChatPay.put("sign", appSign);

微信支付统一下单的接口地址为:api.mch.weixin.qq.com/pay/unified…
java中可以利用httpclient进行post调用。参数即之前拼接完成的带sign签名参数。
(需要将参数转化成xml格式的string进行接口请求)。
返回的数据包含了return_code、return_msg。return_code只有SUCCESS和FAIL,这是通信成功与否的标识,非业务标识。只有return_code是SUCCESS时,才会有其他数据返回包括result_code,sign等。若result_code业务标识也同样为SUCCESS时候才说明微信方预付单生成成功。这时会返回我们支付业务需要的prepay_id预支付会话id。 注意: 这里需要我们进行sign签名验证,以保证数据安全性。\

返回的数据是XML格式的,如下

<xml><appid><![CDATA[wx2421b1c4370ec43b]]></appid><attach><![CDATA[支付测试]]></attach><bank_type><![CDATA[CFT]]></bank_type><fee_type><![CDATA[CNY]]></fee_type><is_subscribe><![CDATA[Y]]></is_subscribe><mch_id><![CDATA[10000100]]></mch_id><nonce_str><![CDATA[5d2b6c2a8db53831f7eda20af46e531c]]></nonce_str><openid><![CDATA[oUpF8uMEb4qRXf22hE3X68TekukE]]></openid><out_trade_no><![CDATA[1409811653]]></out_trade_no><result_code><![CDATA[SUCCESS]]></result_code><return_code><![CDATA[SUCCESS]]></return_code> <sign><![CDATA[B552ED6B279343CB493C5DD0D78AB241]]></sign><time_end><![CDATA[20140903131540]]></time_end><total_fee>1</total_fee><coupon_fee><![CDATA[10]]></coupon_fee><coupon_count><![CDATA[1]]></coupon_count><coupon_type><![CDATA[CASH]]></coupon_type><coupon_id><![CDATA[10000]]></coupon_id><coupon_fee><![CDATA[100]]></coupon_fee><trade_type><![CDATA[JSAPI]]></trade_type><transaction_id><![CDATA[1004400740201409030005092168]]></transaction_id>
</xml>

所以拿到微信支付的结果之后,需要转换成自己需要的格式。

将这些数据返回给客户端,由客户端发起支付,就可以实现微信的支付功能。然后微信端会根据之前设置的notify_url异步通知地址,进行调用,通知服务端支付情况。

商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。


http://chatgpt.dhexx.cn/article/Lg74VlUY.shtml

相关文章

Java开发支付宝支付功能

之前做开发过程中&#xff0c;没有接触过支付相关的功能&#xff0c;最近做了一个支付相关功能的开发&#xff0c;包括支付宝和微信支付&#xff0c;为了避免以后忘记相关的流程&#xff0c;记录一下这次的开发经验&#xff0c;这里先介绍一下支付宝相关的开发。 首先在进行jav…

支付宝支付功能实现

支付宝支付功能 1、电脑网站支付&#xff0c;手机网站支付&#xff0c;app支付1.1、异步通知介绍1.2、API和请求示例介绍 2、当面付3、小程序支付接入4、代码完整代码 支付宝开发文档中心 注意&#xff1a;个人无法使用此功能&#xff0c;因为个人申请使用是不会通过的 1、电脑…

支付功能

Django rest framework之支付功能 一.支付宝支付 1.进入蚂蚁金服开放平台&#xff08;查看api&#xff09;&#xff1a; 1.1在正式生产环境中需要创建应用&#xff08;需审核&#xff09;&#xff1a; 1.2沙箱环境&#xff08;测试&#xff09;&#xff1a; 可以在文档中查看对…

springboot实现支付宝支付功能

支付系统中容易出现的问题 1&#xff0c;用户在页面下订单后&#xff0c;价格被篡改&#xff1b; 解决方案&#xff1a;通过后端计算订单的总金额 2&#xff0c;订单重复处理。用户支付成功后&#xff0c;支付宝会短时间内多次调用我们的回调接口&#xff0c;如果出现网络波动…

2021年,Flutter 与 React Native该如何选择?,安卓app开发教程

一、Flutter 应用的优势 =========================================================================== 1. 热重载 = 快速编码 Flutter 允许开发人员使用一种更复杂、更快速的方式来创建应用程序。这是 Flutter 的最大优势之一,也是所有顶级移动应用开发公司都颇为看重的…

一大波开发者福利来了,一份微软官方Github上发布的开源项目清单等你签收

目录 微软Github开源项目入口微软开源项目受欢迎程度排名 Visual Studio CodeTypeScriptRxJS.NET Core 基础类库CNTKMicrosoft calculatorMonaco editorMS-DOSRedis windows版.NET Core CLR (公共语言运行时)ASP.NET CoreEntity Framework CorePowerShell如何在其中搜索自己需要…

.Net资讯 | 一大波开发者福利来了, 一份微软官方Github上发布的开源项目清单等你签收...

目录 微软Github开源项目入口微软开源项目受欢迎程度排名 Visual Studio CodeTypeScriptRxJS.NET Core 基础类库CNTKMicrosoft calculatorMonaco editorMS-DOSRedis windows版.NET Core CLR (公共语言运行时)ASP.NET CoreEntity Framework CorePowerShell如何在其中搜索自己需要…

FullCalendar:eventColor,eventBackgroundColor, eventBorderColor, and eventTextColor

<!DOCTYPE html><html><head><meta charsetutf-8 /><title>背景色設定</title><link href../fullcalendar.min.css relstylesheet /><link href../fullcalendar.print.min.css relstylesheet mediaprint /><script src../l…

Flutter 与 React Native 该如何选择

跨平台程序员之间关于 React Native 和 Flutter 的旷日持久的争论越来越白热化了。前几年&#xff0c;React Native 还是开发人员的首选框架&#xff0c;但是自 2017 年 Flutter 发布以来&#xff0c;其已经发展成为 React Native 的一个强有力竞争对手。 最近&#xff0c;随着…

2021年,Flutter 与 React Native该如何选择?

????????关注后回复 “进群” &#xff0c;拉你进程序员交流群???????? 作者 | Wasim Charoliya 译者 | 王强 策划 | 田晓旭 2021 年&#xff0c;跨平台程序员之间关于 React Native 和 Flutter 的旷日持久的争论越来越白热化了。前几年&#xff0c;React Nati…

React Native 三端同构实践

⚠️ 博客中涉及的代码内容可查看 Github: react-native-isomorphism React Native三端同构皆在&#x1f22f;️在不改动 React Native 代码下&#xff0c;公用一套代码架构, 在浏览器中实现同样的展示、交互、功能。 在实际开发过程中, 尤其创业公司, 需求的迭代周期是非常快…

吐血推荐|2万字总结Mac所有应用程序、软件工具和相关资料

现在随着互联网的发展&#xff0c;越来越多的公司都鼓励Mac办公&#xff0c;属实MacOS系统对于我们的工作开发效率有很大提升&#xff0c;所以我们需要收集各种类别非常好用的 Mac 应用程序、软件以及工具。作为一个资深 Mac 用户&#xff0c;我需要它们帮助我快乐、高效的工作…

网易云音乐React Native体系建设与发展

本文作者&#xff1a;章伟东 &#xff08;网易云音乐大前端团队&#xff09; 0.33 历史 17 年 3 月份&#xff0c;为了解决商城性能和用户体验问题&#xff0c;云音乐技术团队组建了一只 4 人 ReactNative 开发小分队&#xff1a;我负责 RN 前端开发&#xff0c;安卓和 iOS 两…

每周分享第 26 期

这里记录过去一周&#xff0c;我看到的值得分享的东西&#xff0c;每周五发布。 Basecamp 是 IT 行业很有名的一家公司&#xff0c;提供团队协作工具&#xff0c;同时也是 Rails on Ruby 框架的创造者。这家公司的特别之处在于&#xff0c;它不仅写软件&#xff0c;还写畅销书&…

爱开源的微软是如何击败 Facebook、Google 成为 GitHub No.1 的?

拥抱开源的微软这几年究竟都做了些什么&#xff1f; 去年今月&#xff0c;我在微软开发者峰会上见到了《设计模式&#xff1a;可复用面向对象软件的基础》联合作者、现任微软技术院士&#xff08;Technical Fellow at Microsoft&#xff09;Erich Gamma&#xff0c;那是我第一次…

跨端与同构开发技术一览

关键词&#xff1a;React Native, uni-app, Flutter ,Tauri, Ionic 和 weex 文章目录 前言跨端技术简史几种常见跨端技术对比小程序的繁荣跨端同构技术uni-appTaroreact-native-webreactxpWeex阿里的RaxRemax去哪儿网的qrn-remax-unir去哪儿网的anuKbone腾讯新一代跨端开发框架…

@开发者,一份微软官方Github上发布的开源项目清单等你签收

最近在倒腾WPF的项目&#xff0c;试着搜一下微软官方提供的WPF Smaples, 结果找到了https://github.com/Microsoft/WPF-Samples. 当然还发现了Cortana相关的开源资料http://microsoft.github.io/UWPQuickStart/docs/challenges/cortana-integration.html和UWP资源http://micros…

React Native 三端同构实战

WeiboGoogle用电子邮件发送本页面 0 React Native 三端&#xff08;Web、iOS、Android&#xff09;同构是指在不改动原 React Native 的代码下&#xff0c;让其在浏览器中运行出和在 React Native 环境下一样的页面。对于使用 React Native 开发的页面&#xff0c;如果又单独为…

reactxp搭建,start:windows运行不起来

1、官网 reactxp 2、VSCode和Visual Studio2019 安装VSCode Visual Studio 下载地址 先不用勾选工作负荷&#xff0c;直接安装 3、安装nvm 访问下载地址下载安装nvm&#xff1a; 百度云分享 官网直装链接 nvm的github发行界面下载nvm-setup.exe GitCode镜像下载nvm-setup…

微软发布ReactXP:方便开发者构建跨平台应用

说起跨平台开发工具&#xff0c;开发者们最先想到的无外乎是 Cordova 和 Xamarin。但是前者无法提供足够令人满意的性能表现&#xff0c;而后者在 Web 开发上心有余而力不足。所以&#xff0c;微软 Skype 团队基于 React JS 和 React Native 开发了一款全新的跨平台开发工具 —…