最近需求是 用户兑换微信红包,需要一些验证,加密,以及证书;

工欲善其事必先利其器
感谢前辈的微信SDK 已经维护三年了,还在维护中!

官方文档走一波

文档还是一如既往的 坑人啊,写的很简单,对简单明了。 有接口 有提交方式 有参数类型

开发前的准备:首先需要读一下开发文档,调用任何接口前 都应该仔细看看人家的开发文档,我们可以得到知道,发送红包不是根据微信号,而是根据openid ,openid的获取 是调用微信网页授权的接口 看这里,另外需要微信商户,提前开通现金红包功能,跟以前一样要设置ip白名单;

先上一波成功图:

好了重点来了 开始开发

假设你已经设置好了 ip 白名单 , 已经拿到了用户openid 还有商户号,商户key 有SDK的话很简单一段代码 就实现了
先简单点 实现功能 ,再去读前辈写的SDK 研究代码, 通过查找 SDK里有封装好的api
SDK

/*** 现金红包 <br>** 1.发送频率限制------默认1800/min <br>* 2.发送个数上限------按照默认1800/min算<br>* 3.金额上限------根据传入场景id不同默认上限不同,可以在商户平台产品设置进行设置和申请,最大不大于4999元/个<br>* 4.其他的“量”上的限制还有哪些?------用户当天的领取上限次数,默认是10<br>* 5.如果量上满足不了我们的需求,如何提高各个上限?------金额上限和用户当天领取次数上限可以在商户平台进行设置<br>* 注 <br>* 1:如果你是服务商,希望代你的特约商户发红包,你可以申请获得你特约商户的“现金红包产品授权”。操作路径如下:【登录商户平台-产品中心-* 特约商户授权产品】(即将上线) <br>* 2:红包金额大于200时,请求参数scene_id必传* * @param sendredpack*            sendredpack* @param key*            key* @return SendredpackResult*/public static SendredpackResult mmpaymkttransfersSendredpack(Sendredpack sendredpack,String key){Map<String,String> map = MapUtil.objectToMap( sendredpack);String sign = SignatureUtil.generateSign(map,sendredpack.getSign_type(),key);sendredpack.setSign(sign);String secapiPayRefundXML = XMLConverUtil.convertToXML( sendredpack);HttpUriRequest httpUriRequest = RequestBuilder.post().setHeader(xmlHeader).setUri(baseURI()+ "/mmpaymkttransfers/sendredpack").setEntity(new StringEntity(secapiPayRefundXML,Charset.forName("utf-8"))).build();return LocalHttpClient.keyStoreExecuteXmlResult(sendredpack.getMch_id(),httpUriRequest,SendredpackResult.class,sendredpack.getSign_type(),key);}

简单看一下 需要传入参数 ,一个是封装好的红包实体类 一个是商户Key

开始写

//兑换微信红包Sendredpack  redpack=new Sendredpack();             //微信红包信息redpack.setNonce_str(UUID.randomUUID().toString()); //随机字符串\redpack.setMch_billno(UUID.randomUUID().toString());//商户单号redpack.setMch_id(mch_id);                          //商户号redpack.setWxappid(wxappid);                        //公众号appidredpack.setSend_name(send_name);                    //商户名称redpack.setRe_openid(user.getOpenid());                         //用户openidredpack.setTotal_amount(wxred.getRmb()*num*100);            //付款金额redpack.setTotal_num(total_num);                    //红包发送人数redpack.setWishing("恭喜您兑换成功!");                 //红包祝福语redpack.setClient_ip(localIp());                //ip地址redpack.setAct_name("积分兑换红包活动");                //活动名称redpack.setRemark("备注");                            //备注SendredpackResult  result= PayMchAPI.mmpaymkttransfersSendredpack(redpack,key);if(result==null){return ajax;                                    //未知错误}System.out.println("************ 返回数据**************");System.out.println("返回信息:"+result.getReturn_msg()+" 返回状态码:"+result.getReturn_code()+" 业务结果:"+result.getResult_code()+"错误代码:"+result.getErr_code()+" 错误代码描述:"+result.getErr_code_des());if(!"SUCCESS".equals(result.getReturn_code())){ajax.setMsg(result.getReturn_msg());            //错误原因  ajax.setData(result);return ajax;} 

按道理说 这么写没问题 然而 ,请求api方法的时候 报错了,
说是找不到类 org.apache.http.util.Args, 看了看项目 是引用的 HttpClient jar 冲突了,因为SDK里也引用的有这个包
删除 ok ,接着走
问题来了 这时候 报了一个空指针 ,是SDK里报的 ,这就纳闷了, 写好的SDK 怎么会报空指针。
顺着 代码 打断点 调试 ,
发现问题了 , 是因为 调用微信这个接口的时候 需要从连接池里 获取一个连接, 但是连接池是空的 ,所以空指针了,恩,现在需要做的,就是初始化连接池
在Git 上看到了 设置API HttpClient 请求池大小 的代码

        LocalHttpClient.init(100,10);LocalHttpClient.initMchKeyStore("1329266801","C:\\Users\\Administrator\\Desktop\\cert\\apiclient_cert.p12");LocalHttpClient.setTimeout(5000);//@since 2.7.0//异常重试次数 2LocalHttpClient.setRetryExecutionCount(2);//设置请求连接池

好了 ,前边是 商户id 后边是 证书位置

在测试一波 ,, 还是没有成功

看日志

看到了我们传递给微信的数据 所有的数据都在 没有空数据

接着看

这就有点坑了 , 微信文档明明是说 返回sunccess 就是成功,明明说 单号长度可以为32位 我才用了UUid 好了不多说 ,看到了成功的希望,
改下 继续

这个参数也是有的 长度也没有超出 , 不知道为什么给我报了错, 参数长度减少了一点 好了

到此为止,借用SDK的情况下 ,实现了微信公众号现金红包的 功能 ,

但是 这显然不是我们所想的, 因为我们对实现过程一无所知,所以 我决定 应该往下看 , 看看SDK里是怎么实现的,读人家的代码

微信开发(3):微信公众号发现金红包功能开发,利用第三方SDK实现(Java)相关推荐

  1. 公众号分享页面php,微信公众号网页分享功能开发的示例代码

    现在每天都可以看到很多微信分享的链接上面有网站或者商家的自定义的分享标题,和分享链接的描述及分享出去的图像,例如下面的分享出去的链接: 上面这个是微信的js-SDK页面分享给微信好友在聊天列表中显示的 ...

  2. 微信公众号发红包php开发教程

    使用微信现金红包的3个流程 申请现金红包功能 添加微信现金红包模板 发放现金红包 开发演示demo 发红包 demo 下载 一.开通现金红包权限 在使用现金红包之前,请前往开通现金红包功能.操作路径: ...

  3. 微信公众号网页分享功能开发

    现在每天都可以看到很多微信分享的链接上面有网站或者商家的自定义的分享标题,和分享链接的描述及分享出去的图像,例如下面的分享出去的链接: 上面这个是微信的js-SDK页面分享给微信好友在聊天列表中显示的 ...

  4. 微信公众号开发(一)------对接公众号

    微信公众号开发(一)------对接公众号 前言 一直以来对微信公众号开发想去了解一下,刚好最近有时间去学习,在这里记录一下,方便以后查阅. 正文 微信公众号对接服务器 一.接入 首先我们要去申请一个 ...

  5. 【微信公众号发红包转账】微信公众号上手机网页接收请求,通过公众号给用户发红包 开发流程...

    有了微信支付 的开发做铺垫,相关的微信其他业务处理起来逻辑就能清晰很多. 准备好这两个架包 ------------------------------------------------------ ...

  6. 微信公众号及小程序开发入门(二)

    开发过程中一些对微信公众号和小程序的认识. 一.服务号 在公众号开发入门一中提到,微信公众号分为订阅号和服务号,其中服务号功能最强,只准企业申请,并且要每年交300元认证费.如果企业想拥有自己的公众号 ...

  7. 微信公众号开发——微信获取、操作公众号文章

    微信获取,操作公众号文章 项目地址:https://gitee.com/wrzhxy/wx_article 我以为微信支付和微信企业付款文档就够坑爹了,直到我遇到了微信获取公众号文章... 微信获取公 ...

  8. 微信公众号发送客服消息【文本、图片】

    微信公众号发送客服消息[文本.图片] /// <summary> /// 微信用户唯一标识OpenId /// </summary> public static string ...

  9. 微信公众号的二次开发(一 订阅号没有获取网页授权的解决方法)

    前言 应公司开发需求,最近需要进行公众号的二次开发.经过系列讨论,最后确定为使用订阅号来开发. 因为公众号开发要获取微信用户的基本信息,需要通过用户授权获取code,然后去换取openid,最后在获取 ...

最新文章

  1. Kattis - bela
  2. 南工程计算机学院贴吧,【计算机工程学院答疑转帖】
  3. 学习Java笔记(一)
  4. Java之ThreadPoolExcutor和四种常见的线程池
  5. English trip -- VC(情景课)5 Around Town
  6. android jar包 权限,Android系统启动执行jar程序
  7. 一小时学会用Python Socket 开发可并发的FTP服务器
  8. uni-app uniCloud 开发实践 ,天气预报,小程序,h5,app ,001章
  9. Windows下LaTeX安装教程与新手入门
  10. Python数据库编程练习 ※
  11. 个人微信公众号做外卖优惠券怎么弄?
  12. Nessus最新版8.15安装教程
  13. 关于ABAP调试中的F5,F6,F7,F8的区别和用法
  14. kubernetes(K8s)容器设计模式实践案例 多节点选举模式
  15. 我的Python心路历程 第十期 (10.12 股票实战可视化之分位数)
  16. BZOJ 3168: [Heoi2013]钙铁锌硒维生素 [线性基 Hungary 矩阵求逆]
  17. Zabbix监控系统搭建
  18. Android 引导页开发管理2
  19. Win10家庭版 傻瓜安装datahub的备忘一则
  20. C语言实现『推箱子』

热门文章

  1. 广州立成电商再次荣获“天猫四星级服务商”称号
  2. 解决WIN7设备和打印机里空白,0个对象,但是可以打印的办法
  3. ModuleNotFoundError: No module named ‘_ctypes‘的解决方案
  4. 最新资讯 针对移动手机漏洞与安全支付
  5. 图片url解析正确,但爬虫无法下载图片
  6. 微信开放平台open认证_在Open Knowledge上传播开放数据的日常任务
  7. 贴片电阻上的字符是如何表示电阻的?
  8. 一个免费提供Linux相关ebook的站点
  9. 高速PCB基材介绍(铜箔、PP、基板)
  10. 渐行渐远的老朋友们,谢谢你们曾经陪我走过