java调用微信现金红包接口的心得与体会总结
作者:青蛙小王子 发布时间:2022-12-22 19:55:12
这几天看了下之前写的有关微信支付的博客,看的人还是挺多的,看了下留言不知道是因为博客写的不够细还是什么情况,大多都找我要源码,我觉得吧程序员还是需要有这么一个思考的过程,因此没直接给源码,俗话说“授人以鱼不如授人以渔”。因此希望看文章的同时也花一点时间自己亲自敲一敲代码。好了废话不多说这次来分享微信现金红包接口的使用。
下面是微信开发文档对现金红包的介绍:
现金红包,是微信支付商户平台提供的营销工具之一,上线以来深受广大商户与用户的喜爱。商户可以通过本平台向微信支付用户发放现金红包。用户领取红包后,资金到达用户微信支付零钱账户,和零钱包的其他资金有一样的使用出口;若用户未领取,资金将会在24小时后退回商户的微信支付账户中。
产品意义
微信支付现金红包因资金的承载方式为现金,一直以来深受用户的青睐,近年来的春晚中,现金红包都扮演着重要的角色;在日常运营中也为商户的营销活动带来热烈的反响。总的来说,现金红包在包括但不仅限于以下场景中发挥着重要意义:
◆ 为企业拉取新用户、巩固老用户关系、提升用户活跃度
◆ 结合巧妙的创意点子,辅以红包点缀,打造火爆的活动,提升企业与品牌知名度
◆ 结合企业运营活动,以红包作为奖品,使你的抽奖、满送等营销活动更便利进行
◆ 同时,除了营销之外,现金红包在企业日常的运营中也扮演着重要角色。如:为员工返福利、为供应商返利、会员积分/虚拟等级兑现等等
综上所述微信现金红包是一种营销工具,可以通过关注公众号、注册等给用户发放增加用户粘性。这次着重从程序开发方面分享我的心得体会
一 使用微信现金红包功能需具备的条件
1 拥有微信商户平台且秘钥证书齐全
2 商户平太需要有足够的余额可供使用(不够可以从商户平台使用财付通充值)
3 有微信支付开发基础更佳
二 开发的重点和难点
1 微信签名算法
2 httpclient以及证书的使用
3 微信文档的阅读(https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3)
如果有微信h5支付或扫码支付的童鞋看这一部分的文档可以说是小菜一碟,理解起来不费吹灰之力,同时只要掌握httpclient的知识就万事俱备了
三 直接撸代码
public static void sendRedPack(String mch_billno,String openId,String send_name,String total_fee,String total_num,String wishing,String act_name,String remark,String ip) throws Exception{
String non=PayCommonUtil.CreateNoncestr();
SortedMap<Object, Object> p = new TreeMap<Object, Object>();
p.put("nonce_str", non);
p.put("mch_billno", mch_billno);
p.put("mch_id", ConfigUtil.MCH_ID);
p.put("wxappid", ConfigUtil.APPID);
p.put("re_openid", openId);
p.put("total_amount", total_fee);
p.put("total_num", "1");
p.put("client_ip", "127.0.0.1");
p.put("act_name",act_name);
p.put("send_name", send_name);
p.put("wishing", wishing);
p.put("remark",remark);
String sign = PayCommonUtil.createSign("UTF-8", p);
System.out.println(sign);
p.put("sign", sign);
String reuqestXml = PayCommonUtil.getRequestXml(p);
KeyStore keyStore = KeyStore.getInstance("PKCS12");
FileInputStream instream = new FileInputStream(new File(ConfigUtil.CERT_PATH));
try {
keyStore.load(instream, ConfigUtil.MCH_ID.toCharArray());
} finally {
instream.close();
}
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore,
ConfigUtil.MCH_ID.toCharArray()).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext, new String[] { "TLSv1" }, null,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf).build();
try {
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack");// 退款接口
httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
System.out.println("executing request" + httpPost.getRequestLine());
//请求的xml需转码为iso8859-1编码,否则易出现签名错误或红包上的文字显示有误
StringEntity reqEntity = new StringEntity(new String(reuqestXml.getBytes(), "ISO8859-1"));
// 设置类型
httpPost.setEntity(reqEntity);
CloseableHttpResponse response = httpclient.execute(httpPost);
try {
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
if (entity != null) {
System.out.println("Response content length: "
+ entity.getContentLength());
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(entity.getContent(), "UTF-8"));
String text;
while ((text = bufferedReader.readLine()) != null) {
System.out.println(text);
}
}
EntityUtils.consume(entity);
} finally {
response.close();
}
} finally {
httpclient.close();
}
}
需要注意的地方是下面这里:
//请求的xml需转码为iso8859-1编码,否则易出现签名错误或红包上的文字显示有误
StringEntity reqEntity = new StringEntity(new String(reuqestXml.getBytes(), "ISO8859-1"));
这个地方可以说把我弄得差点崩溃了各种试,各种调试还是抱着试一试的心态加上去就OK了,这个可能是因为httpclient和原生的HttpsConnection在数据传输上的不同吧。这里没做过多的研究。
调用这个方法就更简单了直接像下面这样
public static void main(String args[]){
try {
sendRedPack("12828839012016101420","接收者的openid","xxx","100","1","恭喜发财,年年有余","新年红包","新年红包还不快抢","127.0.0.1");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
红包发送后打印的信息如下:
TTP/1.1 200 OK Response content length: 567 <xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[发放成功]]></return_msg> <result_code><![CDATA[SUCCESS]]></result_code> <err_code><![CDATA[SUCCESS]]></err_code> <err_code_des><![CDATA[发放成功]]></err_code_des> <mch_billno><![CDATA[12828839012016101421]]></mch_billno> <mch_id><![CDATA[1282883901]]></mch_id> <wxappid><![CDATA[xxxxx]]></wxappid> <re_openid><![CDATA[xxxx]]></re_openid> <total_amount>100</total_amount> <send_listid><![CDATA[1000041701201610143000090813093]]></send_listid> </xml>


猜你喜欢
- Gituhb项目Volley源码中文注释项目我已经上传到github,欢迎大家fork和start.为什么写这篇博客本来文章是维护在gith
- 1,实现方法一:通过给当前界面布局文件的父layout设置点击事件(相当于给整个Activity设置点击事件),在事件里进行键盘隐藏<
- 项目场景:适用于接口数据敏感信息,比如 明文传输姓名、居住地址、手机号等信息,如果存在明文传输敏感数据问题、及数据泄漏风险,则可使用此方法加
- File存储(内部存储)一旦程序在设备安装后,data/data/包名/ 即为内部存储空间,对外保密。Context提供了2个方法来打开输入
- 只是为了研究下idea这款编译器怎么使用。开门见山,说下如何配置这款编译器,不配置也能用,但是强迫症表示不服。下面直入正题:下载与安装就不说
- 应用程序初始化时需要批量的向sqlite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢,因为 sqlite插入数据的时候
- 今天遇到pom中添加dependency时相关的jar会自动下载,但是左边的External Libraries中一直获取不到添加的jar问
- C#抓图服务首先抽象出抓图接口,然后对接口做基于公共操作的抽象类封装,之后针对不同的抓图方式做差异化处理,最后根据接口实现抓图服务。注意:W
- 前言最近一年多的时间陆续接触了一些对我来说陌生的语言,主要就是 Python 和 Go,期间为了快速实现需求只是依葫芦画瓢的撸代码;并没有深
- 前言请看下面几个问题Spring为什么不推荐使用@Autowired 注解?为什么推荐使用@Resource 代替&nb
- 1. 实现效果1.1 controller最终实现效果,在接口上标记上 @Router 注解用来标记当前接口需要根据参数中的某个字段进行数据
- AndroidStudio升级后, 新建类变成了下面这个样子, 并且默认还没有修饰符, 一堆大写的英文看的我一脸懵逼, 后来在stackov
- 在Android开发中很多时候会遇到一屏显示不下所有内容的现象,那大家也知道这个时候肯定会想到用scrollview来进行滚屏显示。这个时候
- 方法一:利用两个指针p,q,首先将q往链表尾部移动n位,然后再将p、q一起往后移,那么当q达到链表尾部时,p即指向链表的倒数第n个节点。no
- 在SpringAMQP的发送方法中,接收消息的类型是Object,也就是说我们可以发送任意对象类型的消息,SpringAMQP会帮我们序列化
- 首先安装consul环境,参照之前的文章:https://www.jb51.net/article/141789.htm项目规划,2个服务端
- ThreadLocal简介变量值的共享可以使用public static的形式,所有线程都使用同一个变量,如果想实现每一个线程都有自己的共享
- 目录简介匿名方法的参数使用范围委托示例简介在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法。而 C# 2.0 -- 引
- 问题:在用Java程序进行读写含中文的txt文件时,经常会出现读出或写入的内容会出现乱码。原因其实很简单,就是系统的编码和程序的编码采用了不
- 为方便自己以后学习,自己记录学习,大家也可以参考,有什么问题一起探讨。今天学习RecyclerView,下边来说一下实现数据垂直滚动和数据横