[分享] 微信支付中商户对个人用户付款案例
2019独角兽企业重金招聘Python工程师标准>>>
随着微信支付的普及,越来越的APP要求支持微信支付。相信大多数开发者也碰到了这样的需求。百度了一下,大家用到最多的是微信支付中个人对商户的支付业务,而很少有人用到微信中商户对个人付款的业务。我最近就碰到了这样的需求,因为从来没有做过,所以只能查资料,可是百度到的资料很少,并且是过时的东西。又问了圈子里的高手,可是大家都没有做过。没办法只有硬着头皮自己拱吧!还好还好,功夫不负有心人啊!终于被我整明白了,现在得空,拿出来跟大家一起分享。
首先给大家吃颗定心丸,所有的东西在你没有用过之前,它都是神秘的,当你用过之后,就会发现,也就那么回事。呵呵,开始正题吧!
这是企业付款的文档地址,大家需要先仔细看两遍。https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1 (就算有我的指导,也建议大家先看文档,看文档能便于加深大家的理解)
总体思路: 1、准备数据;2、把所有的参数连接成一个字符串,然后进行MD5,把MD5得到的一个字符串做为最后一个参;3、把微信提供的安全证,封装到要提交的数据;(商户证书获取方法:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3 4、通过JAVA程序向微信提供的接口POST数据。微信接口返回处理结果。
1、准备数据:所谓的数据就是请求参数,有9个参数是必须的,详细说明见文档(https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2)。下面我给大家提供我的示例代码。
//配置接口参数,以下是9个必须的参数。
signParams.put("mch_appid", appid); // 微信分配的公众账号ID(企业号corpid即为此appId)
signParams.put("mchid", mchid);// 微信支付分配的商户号
signParams.put("nonce_str", uuid); // 随机字符串,不长于32位
signParams.put("partner_trade_no", partner_trade_no); // 商户订单号,需保持唯一性
signParams.put("openid", openid); // 商户appid下,某用户的openid
signParams.put("check_name", "NO_CHECK"); // NO_CHECK:不校验真实姓名
// FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账)
// OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功)
signParams.put("amount", amount); // 企业付款金额,单位为分
signParams.put("desc", desc); // 企业付款操作说明信息。必填。
signParams.put("spbill_create_ip", ip); // 调用接口的机器Ip地址
注意map.put()中的key是死的写法,不能改。
2、把所有的参数拼接成一个字符串,然后进行MD5运算,把得到的运算结果,做为签名参数,一起POST给接口。详细做法参考文档(https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=4_3)
3、为了提高程序的可用性,我把一些受微信影响,会变动的参数写到了配置文件里。配置文件和JAVA文件放在同一目录里就可以了。
安全证书这一步是关键,微信为了提高接口的安全性,所以增加了安全证书,以保证资金的安全。JAVA里用到的证书是pkcs12格式,大家按照文档里的提示,去下载相关证书,然后放到自己指定的目录里就可以了。下面是获取证书,并发起POST请求的代码示例。
// 获取证书,发送POST请求;
KeyStore keyStore = KeyStore.getInstance("PKCS12");
FileInputStream instream = new FileInputStream(new File(config.elementTextTrim("cert_path"))); // 从配置文件里读取证书的路径信息
keyStore.load(instream, mchid.toCharArray());// 证书密码是商户ID
instream.close();
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchid.toCharArray()).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
HttpPost httpost = new HttpPost(url); //发起POST请求
4、向接口POST数据 ,获得返回结果。下面是我的示例代码。
CloseableHttpResponse response = httpclient.execute(httpost);
HttpEntity entity = response.getEntity();
String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8");
EntityUtils.consume(entity);
// 把返回的字符串解释成DOM节点
Document dom = DocumentHelper.parseText(jsonStr);
Element root = dom.getRootElement();
String returnCode = root.element("result_code").getText(); // 获取返回代码
if (StringUtils.equals(returnCode, "SUCCESS")) { // 判断返回码为成功还是失败
String payment_no = root.element("payment_no").getText(); // 获取支付流水号
String payment_time = root.element("payment_time").getText(); // 获取支付时间
map.put("state", returnCode);
map.put("payment_no", payment_no);
map.put("payment_time", payment_time);
return map;
} else {
String err_code = root.element("err_code").getText(); // 获取错误代码
String err_code_des = root.element("err_code_des").getText();// 获取错误描述
map.put("state", returnCode);// state
map.put("err_code", err_code);// err_code
map.put("err_code_des", err_code_des);// err_code_des
return map;
}
以上4步,就完成了微信企业付款的业务。
需要用到的jar包和我的程序示例代码。喜欢拿来就用的伙伴只需要写写配置文件,下载了安全证书,我的程序就可以直接拿来用了。源码地址:http://pan.baidu.com/s/1gfqbVJt
有问题可以跟帖咨询。
欢迎大家共同学习,共同进步。
转载于:https://my.oschina.net/AnnAnnAny/blog/714965
[分享] 微信支付中商户对个人用户付款案例相关推荐
- 浅析微信支付:商户平台代金券或立减优惠开通、指定用户代金券发放、查询等
本文是[浅析微信支付]系列文章的第十四篇,主要讲解在如何开通商户平台的代金券或立减优惠功能,商家向指定用户发送代金券,查询发送记录,代金券信息等. 浅析微信支付系列已经更新十四篇了哟-,没有看过的朋友 ...
- java怎么调用支付接口测试_微信支付中微信红包的接口测试,Java版本
需要有认证的公众号,且开通了微信支付,商户平台且开通了现金红包的权限即可. 商户登陆地址:https://pay.weixin.qq.com选择查看营销中心的现金红包. 现金红包的官网文档说明: ht ...
- 微信支付普通商户分账-添加分账接收方
微信支付普通商户分账-添加分账接收方 写在前面: 微信官方文档 SIGN值校验检查地址 调试中可能遇到的问题 直接上代码 写在前面: 微信官方文档 https://pay.weixin.qq.com/ ...
- 微信支付后“自动”绑定用户手机号与公众号
微信支付后"自动"绑定用户手机号与公众号 说明: 这里的微信支付是指 微信网页支付(h5) 微信支付的内容必定是和手机号码有关联的(当然交易中涉及的其他用户信息也是可以用同样的办法 ...
- 微信支付报错:用户传入的appid不正确,请联系商户处理
微信APP支付的时候,报用户传入的appid不正确,请联系商户处理错误 解决方案: 1 . 确保所有配置正确 2 .可以检查一下签名的大小写
- Java教程:如何申请Java开发微信支付中的必要参数(appid,appsecret,商户号,微信支付密钥)
这一章我们来说下,微信开发中的一些必要参数申请,如appid,appsecret,商户号,微信支付密钥 第一步: 我们要申请微信公众服务号 链接:https://mp.weixin.qq.com/ 第 ...
- 详解微信支付中的异步通知
1.什么是异步通知? 先说说同步通知,在平时我们付款的时候,特别是在银行转账的时候点击付款后一般都会给我们反馈显示付款成功,这个通知就是同步通知.同步通知仅仅代表调用支付接口成功,也就是用户付款的操作 ...
- 微信钱包里的钱居然不见了,微信支付绑卡的用户要注意这几点
科技发展的脚步越来越快,我们的支付手段也从以前的现金支付变成了现在的电子支付.电子支付的方式十分便利,无论是超市.菜场还是饭店,只要是有金钱交易的地方就可以使用电子支付.用户只需要打开手机扫一扫就可以 ...
- java 红包接口_微信支付中微信红包的接口测试,Java版本
文档中普通红包有关于所有的讲解,调用必须有商户平台的证书: https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=1 ...
- 微信支付 - 构建商户订单
// 微信支付成功 -> 支付中心 -> 吃货平台 // |-> 回调通知的url String payReturnUrl = "http://api.z.xuexi.co ...
最新文章
- 【Qt】Log4Qt(一)下载、编译
- Linux学习之系统编程篇:管道设置为非阻塞及管道的读写行为
- iOS8+ UITableView自动计算cell高度并缓存
- linux 分区 文件,Linux的分区与文件结构
- 中小型园区网络的基本部署之动手划分vlan
- C语言26L,LNBH26L - 双路LNBS电源和控制IC,带升压和I²C接口 - STMicroelectronics
- python复利代码_python复利
- c语言 camp;gt与camp;lt,那位高人告诉我怎么复习c语言二级啊?????
- ELK filebeat和logstash使用:配置单个文件来源、配置多个文件来源
- web中使用阿里巴巴矢量库作为图标管理
- 读《About Face 4 交互设计精髓》20
- DNF—警告码(0,20003,116)您的游戏环境异常,请重启机器后再试—不管win几都行的解决方法
- python 拦截windows弹窗广告_通过python实现弹窗广告拦截过程详解
- talentq测试题库rb_talentq测试题目拐
- U-net复现pytorch版本 以及制作自己的数据集并训练
- [LLVM]LLVM入门 ---llvm 代码结构
- html5怎么将字体变成斜体,;html5斜体字
- 计算机连接网络被限制,电脑连接wifi出现网络受限的解决方法
- java数据结构-动态规划算法-一次性学会
- android studio高德地图的显示于定位(附带逆地理编码围栏)
热门文章
- [Linux][Ubuntu][14.04.3LTS]安装NVidia显卡驱动
- MapReduce原理转
- Mac合并pdf文件最简单的方法——PDF Expert合并pdf文件教程
- iOS底层探索之多线程(十六)——锁分析(NSLock、NSCondtion、NSRecursiveLock、NSCondition)
- 分区丢失导致文件丢失?巧用EasyreCovery找回
- 喜大普奔,FL Studio终于出官方中文版了!
- 云计算vs雾计算:物联网的发展能否「云开雾散」?
- Struts2——知识点:Action Implements SessionAware
- oracle归档日志满了的处理方法
- Linux 多进程学习