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>

标签:java,微信红包
0
投稿

猜你喜欢

  • Java多线程中关于join方法的使用实例解析

    2023-08-22 21:47:29
  • android编程实现sd卡读取数据库的方法

    2021-10-03 12:26:31
  • Java中的权限修饰符(protected)示例详解

    2023-04-16 10:23:24
  • SpringMVC的注解@RequestMapping属性及使用

    2022-12-31 02:03:00
  • C#中四步轻松使用log4net记录本地日志的方法

    2021-12-22 02:23:16
  • java基础的详细了解第四天

    2022-11-25 07:24:51
  • Android实现类似360,QQ管家那样的悬浮窗

    2022-07-04 02:58:05
  • android开发之蜂鸣提示音和震动提示的实现原理与参考代码

    2022-11-22 21:47:38
  • Android SurfaceView拍照录像实现方法

    2022-06-18 17:07:20
  • Java多线程 volatile关键字详解

    2023-07-16 02:13:31
  • C#计算矩阵的逆矩阵方法实例分析

    2021-11-06 18:24:29
  • Android开发仿扫一扫实现拍摄框内的照片功能

    2023-03-17 14:11:12
  • winform基于异步委托实现多线程摇奖器

    2021-10-09 05:09:39
  • 解决persistence.xml配置文件修改存放路径的问题

    2023-07-16 09:53:54
  • C#异步编程由浅入深(一)

    2023-12-16 07:32:29
  • Java基础将Bean属性值放入Map中的实例

    2023-10-11 13:57:40
  • 简单实现Android倒计时效果

    2022-03-26 01:58:14
  • Java编程中ArrayList源码分析

    2023-05-20 00:05:25
  • C# Socket编程实现简单的局域网聊天器的示例代码

    2022-10-01 19:45:45
  • Java中this关键字的用法详解

    2023-10-04 05:05:53
  • asp之家 软件编程 m.aspxhome.com