Java 关于微信公众号支付总结附代码
很多朋友第一次做微信支付的时候都有蒙,但当你完整的做一次就会发现其实并没有那么难
业务流程和应用场景官网有详细的说明:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_4,我就不做具体介绍了,我主要介绍一下作为开发的我们需要做的事情,微信官网要完成的部分我们就先不要考虑了
开发流程:
1.获取用户授权,有两种形式:
一种是snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid);另一种是:snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )
2.调用统一下单接口获取预支付ID;(重点)
3.H5调起微信支付的内置JS
4.支付完成后,微信回调的处理,这里主要就是处理支付成功后自己项目的业务逻辑
获取统一下单接口所需参数:
所需参数去哪里找其实官方也有具体说明:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
appid:微信支付分配的公众账号ID(企业号corpid即为此appId) 登陆微信公众号后台==>开发==>基本配置
mch_id : 微信支付分配的商户号 ; 登陆位置公众号支付后台就可以看到
device_info :设备号;可以为终端设备号(门店号或收银设备ID) PC网页或公众号内支付可以传"WEB"
nonce_str:随机字符串,长度要求在32位以内;自己随机生成就行
小科普一下:nonce=Number once 表示在密码学中Nonce是一个只被使用一次的任意或非重复的随机数值
sign:签名,官方详细描述:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3;
这是小白们经常栽跟头的地方,不过不用担心,下面我会附上前面算法
sign_type:签名类型,默认为MD5,支持HMAC-SHA256和MD5。
body:商品简单描述信息,自定义即可
out_trade_no:商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|* 且在同一个商户号下唯一;
total_fee:订单总金额,注意单位为分
spbill_create_ip:终端IP;APP和网页支付提交用户端ip
notify_url:回调函数的通知地址,异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数,就是自己处理支付完业务的接口路径
trade_type:交易类型,JSAPI 公众号支付;NATIVE 扫码支付;APP APP支付
key :密钥,签名时用,key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
最方面的就是自己想了一个字符串,然后用MD5(其他加密方式也可以)加密成32位的字符串,重新设置。
调用统一下单接口:
所需要的参数签名已经都有具体介绍了,这里我就直接上代码了
- SortedMap<Object,Object> packageParams = new TreeMap<Object,Object>();
- packageParams.put("appid", appid);
- packageParams.put("mch_id", mch_id);
- packageParams.put("device_info", "WEB");
- packageParams.put("body", "自定义描述信息");
- packageParams.put("out_trade_no","商户系统内部订单号");
- packageParams.put("total_fee","支付金额");
- packageParams.put("spbill_create_ip", "终端IP");
- packageParams.put("notify_url","回调地址url");
- packageParams.put("trade_type","JSAPI");
- packageParams.put("nonce_str", "随机字符串");
- packageParams.put("sign","签名结果");
统一下单接口地址:https://api.mch.weixin.qq.com/pay/unifiedorder
准备好数据后,封装成XML,调起统一下单接口,会返回一个XML格式数据 return_code为SUCCESS时,请求成功,获取我们需要的预支付id(prepay_id)这时就已经成功了一大半,可以稍作休息,犒劳一下自己了。
附上加密算法:传入上面准备的map数据
- StringBuffer sb = new StringBuffer();
- Set es = parameters.entrySet();
- Iterator it = es.iterator();
- while(it.hasNext()) {
- Map.Entry entry = (Map.Entry)it.next();
- String k = (String)entry.getKey();
- Object v = entry.getValue();
- if(null != v && !"".equals(v)
- && !"sign".equals(k) && !"key".equals(k)) {
- sb.append(k + "=" + v + "&");
- }
- }
- sb.append("key=" +密钥key);
- String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
为H5调起微信支付的内置JS 准备数据:
这次的字段名和上次准备数据有所不一样
appId:只是I大写,值还是一样的
nonceStr:随机字符串,长度要求在32位以内;自己随机生成就行
package:统一下单接口返回的prepay_id参数值,提交格式如:prepay_id=***
timeStamp:时间戳
signType:签名方式,默认MD5
paySign:签名
- SortedMap<Object,Object> packageParams = new TreeMap<Object,Object>();
- packageParams.put("appId","商户号");
- packageParams.put("timeStamp","时间戳");
- packageParams.put("nonceStr","随机字符串");
- packageParams.put("prepayid","前面得到的预支付id");
- packageParams.put("package","prepay_id=前面得到的预支付id");
- packageParams.put("signType","MD5");
- packageParams.put("paySign","签名");
如果所有配置都OK,就会弹出请输入密码的界面,反之提示目录未授权,这时候你就应该想时候配置授权目录了
微信公众平台后台 ==> 微信支付 ==> 开发者配置,S API网页支付,然后添加系统后台的授权目录
其他微信支付配置参考:https://jingyan.baidu.com/article/77b8dc7fef360d6174eab690.html
回调函数处理:
1)解析传过来的流信息,通过重新签名的方式验证流中包含的信息的正确性。就是判断这个信息到底是不是微信发的
2)return_code和result_code都是SUCCESS的话,处理商户自己的业务逻辑。就是订单的支付状态啊等一些信息。
3)告诉微信,我收到你的返回值了。不用在发了。
Java 关于微信公众号支付总结附代码的更多相关文章
- java版微信公众号支付(H5调微信内置API)
最近需要做微信公众号支付,网上找了大堆的代码,大多都只说了个原理,自己踩了太多坑,所有的坑,都会再下面的文章中标注,代码我也贴上最全的(叫我雷锋)!!! 第一步:配置支付授权目录 你需要有将你公司的微 ...
- java开发微信公众号支付(JSAPI)
https://www.cnblogs.com/gopark/p/9394951.html,这篇文章写的已经很详细了. 下面写一下自己的思路: 1.首先下载demo,地址:https://pay.we ...
- 微信公众号支付开发全过程 --JAVA
按照惯例,开头总得写点感想 ------------------------------------------------------------------ 业务流程 这个微信官网说的还是很详细的 ...
- 到处是坑的微信公众号支付开发(java)
之前公司项目开发中支付是用阿里的支付做的,那叫一个简单,随意:悲催的是,现在公司开发了微信公众号,所以我步入了全是坑的微信支付开发中... ------------------------------ ...
- 微信公众号支付备忘及填坑之路-java
一.背景 最近公司给第三方开发了一个公众号,其中最重要的功能是支付,由于是第一次开发,遇到的坑特别的多,截止我写博客时,支付已经完成,在这里我把遇到的坑记录一下(不涉及退款).不得不吐槽一下,腾讯这么 ...
- 微信公众号支付(JSAPI)对接备忘
0 说明 本文里说的微信公众号支付对接指的是对接第三方支付平台的微信公众号支付接口. 非微信支付官方文档里的公众号支付开发者文档那样的对接.不过,毕竟腾讯会把一部分渠道放给银行或有支付牌照的支付机构, ...
- 微信公众号支付调用chooseWXPay提示“errmsg choosewxpay fail”
微信公众号支付一直提示“errmsg choosewxpay fail”,也没有提示具体错误信息,签名没有问题(签名验证地址:https://pay.weixin.qq.com/wiki/doc/ap ...
- 微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
这段时间一直比较忙,一忙起来真感觉自己就只是一台挣钱的机器了(说的好像能挣到多少钱似的,呵呵):这会儿难得有点儿空闲时间,想把前段时间开发微信公众号支付遇到问题及解决方法跟大家分享下,这些“暗坑”能不 ...
- 使用开源库MAGICODES.WECHAT.SDK进行微信公众号支付开发
概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解.可加群获取原始文档. 本篇主要讲解微信支付的开发流程,相关业务基于MAGICODES.WECHAT.SDK实现.通过本篇教程,您可以很 ...
随机推荐
- asp.net mvc4 使用分部视图来刷新数据库
前几天研究SSE,用浏览器做侦听后台数据库数据变化,如果有更新,就即时通过浏览器,使用SSE效果果然OK,侦听数据库有更新时马上会向浏览器通知有新数据,我还在浏览器里放了短音提示,但遇到一个问题,发出 ...
- RT-thread内核之事件
一.事件控制块:在include/rtdef.h中 #ifdef RT_USING_EVENT /** * flag defintions in event */ #define RT_EVENT_F ...
- 【codevs3160】最长公共子串 后缀数组
题目描述 给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 输入 读入两个字符串 输出 输出最长公共子串的长度 样例输入 yeshowmuchiloveyoumydearmotherrea ...
- BFS的小结
写这类搜索题.首先感觉要有个框架.比如我的框架对于BFS来说(对于DFS,我想有两个一个是递归版一个是栈版).这里是BFS小结.所以介绍一下BFS.我的框架.(也是搜集了网上许多神人的作品.) 1:节 ...
- [牛客Wannafly挑战赛27D]绿魔法师
description newcoder 给你一个空的可重集合\(S\). \(n\)次操作,每次操作给出\(x\),\(k\),\(p\),执行以下操作: \(opt\ 1\):在S中加入x. \( ...
- POJ2945:Find the Clones——题解
http://poj.org/problem?id=2945 还是trie树……对于结束标记累加并且开个数组记录一下即可. #include<cstdio> #include<cst ...
- Static全局变量与普通的全局变量有什么区别?static函数与普通函数有什么区别?
Static全局变量与普通的全局变量有什么区别? 答: 全局变量(外部变量)的说明之前再冠以static就构成了静态的全局变量.全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式. 这两者 ...
- BZOJ2553 [BeiJing2011]禁忌 【AC自动机 + dp + 矩乘优化】
题目链接 BZOJ2553 题解 话说在前,此题卡精度,最好开long double 先建\(AC\)自动机 求期望,逆着求,设\(f[i][j]\)为长度为\(i\)的串,当前匹配AC自动机\(j\ ...
- redux的一些插件总结(redux-actions,reselect)
redux本身还是过于简单,实际使用的时候需要配合许多插件. 下面是一些插件与vuex的功能对比 redux-actions <=> vuex的mutation的写法 reselect & ...
- Educational Codeforces Round 48 (Rated for Div. 2) CD题解
Educational Codeforces Round 48 (Rated for Div. 2) C. Vasya And The Mushrooms 题目链接:https://codeforce ...