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

工欲善其事必先利其器
感谢前辈的微信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); //公众号appid
redpack.setSend_name(send_name); //商户名称
redpack.setRe_openid(user.getOpenid()); //用户openid
redpack.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 //异常重试次数 2 LocalHttpClient.setRetryExecutionCount(2);
//设置请求连接池

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

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

看日志

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

接着看


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


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

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

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

微信开发(3):微信公众号发现金红包功能开发,利用第三方SDK实现(转)的更多相关文章

  1. C#开发微信门户及应用(37)--微信公众号标签管理功能

    微信公众号,仿照企业号的思路,增加了标签管理的功能,对关注的粉丝可以设置标签管理,实现更加方便的分组管理功能.开发者可以使用用户标签管理的相关接口,实现对公众号的标签进行创建.查询.修改.删除等操作, ...

  2. 微信小程序的功能开发工具跟公众号的差别,小程序是一种减负思维对简单APP是巨大打击

    微信小程序的功能开发工具跟公众号的差别,小程序是一种减负思维对简单APP是巨大打击 摘要: 小程序和公众号最大的区别有如下四点:1.小程序没有粉丝,开发者在后台能看到的只能是累计用户访问数以及实时统计 ...

  3. 微信公众号发送客服消息提示errcode":45015,"errmsg":"response out of time limit or subscription is canceled hint:解决办法【已解决】

    微信公众号发送客服消息提示errcode":45015,"errmsg":"response out of time limit or subscription ...

  4. 基于.net5 wtm框架、uni-app微信公众号开发一、公众号授权

    前端公众号授权 公众号设置 0.首先用IIS创建一个空目录的网站用于公众号域名验证,接着把该网站内网穿透出去,推荐用utools工具,官网:https://u.tools/ 下载安装好后搜索内网穿透并 ...

  5. 微信小程序自运营器 微信小程序自动运营器(让你的微信小程序,公众号零运营成本,24小时全自动运营)

    自动发单,自动评价,自动评论,自动推广 微信小程序自运营器  微信小程序自动运营器(让你的微信小程序,公众号零运营成本,24小时全自动运营) 我们会根据你的微信公众号或微信小程序定制开发带有一定AI智 ...

  6. Python3 itchat微信获取好友、公众号、群聊的基础信息

    Python3 itchat微信获取好友.公众号.群聊的基础信息 一.简介 安装 itchat pip install itchat 使用个人微信的过程当中主要有三种账号需要获取,分别为: 好友 公众 ...

  7. .NET微信公众号开发-4.0公众号消息处理

    一.前言 微信公众平台的消息处理还是比较完善的,有最基本的文本消息,到图文消息,到图片消息,语音消息,视频消息,音乐消息其基本原理都是一样的,只不过所post的xml数据有所差别,在处理消息之前,我们 ...

  8. 微信开发笔记:公众号获取access_token

    微信开发中,access_token的获取是一种非常常见的功能,通过公众号的appid和appsecret来向微信公众平台请求一个临时通行凭证:access_token.公众平台上的绝大部分操作都会需 ...

  9. 微信公众号抢现金红包活动的核心代码分析(asp.net C#)

    今年春节微信抢红包,我想各位都还记得.最近很多商家也在使用公众号给粉丝发红包,做营销活动.吸粉活动或者是反馈老用户等. 我们作为第3方开发者,就义不容辞的来给这些商家服务了.首先我们得会使用程序来写抢 ...

随机推荐

  1. linux -- chown修改文件拥有者和所在组

    chown将指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID:组可以是组名或者组ID:文件是以空格分开的要改变权限的文件列表,支持通配符.系统管理员经常使用chown命令,在将文件拷贝 ...

  2. 转载:MochiWeb一些资料的链接

    转自:http://veniceweb.googlecode.com/svn/trunk/public/daily_tech_doc/mochiweb_20091030.txt MochiWeb项目主 ...

  3. Z字形扫描矩阵

    问题描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n×n的矩阵,Z字形扫描的过程如下图所示: 对于下面的4×4的矩阵, 1 5 3 9 3 7 5 ...

  4. rdesktop连接远程windows

    $ info rdesktop   //看一下帮助信息吧$rdesktop 192.168.1.1 //打开了一个8位色彩的,$rdesktop -a 16 192.168.1.1 //这个是16位色 ...

  5. this总结

    this总结,mark一下: Object中的this: Object方法中的this,指向的就是该对象,即谁调用this就指向谁,与C#等服务器语言的思想比较一致. let demo = { nam ...

  6. storm深入研究

    著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:He Ransom链接:http://www.zhihu.com/question/23441639/answer/28075 ...

  7. 感恩节MathType公式编辑器6折优惠启动

    MathType是由美国Design Science公司开发功能强大的公式编辑器,专门用来对数学公式的编辑,与常见的文字处理软件和演示程序配合使用,能够在各种文档中加入复杂的数学公式和符号.感恩节期间 ...

  8. 最新版ChemDraw 15.1 免费获取下载

    ChemDraw 15.1 Pro是最新版的ChemOffice套件的个人生产力工具,它可以帮助科学家有效地捕捉和分享工作内容,通过可视化功能对结果获得更深入的了解.现在为大家带来好消息,ChemOf ...

  9. 【转】理清基本的git(github)流程

    概述 当我初次接触git时,我需要快速学习基本的git工作流,以便快速接收一个开源Web项目维护.但是,我很难理解工作流程,因为我不太了解git使用关键点. fork,clone,pull.branc ...

  10. 验证码显示不出来,在THINKPHP中的使用

    未开启 php_gd2设置 php的配置文件php.ini,搜索extension=php_gd2.dll,去掉前面的分号即可: 1.在模块类中增加一个 verify 方法来用于显示验证码Public ...