微信小程序> 微信公众号红包,微信开发3:微信公众号发现金红包功能开发,利用第三方SDK实现转

微信公众号红包,微信开发3:微信公众号发现金红包功能开发,利用第三方SDK实现转

浏览量:936 时间: 来源:weixin_30847865
最近需求是用户兑换微信红包,需要一些验证,加密,以及证书;
工欲善其事必先利其器感谢前辈的微信SDK已经维护三年了,还在维护中!
官方文档走一波
文档还是一如既往的坑人啊,写的很简单,对简单明了。有接口有提交方式有参数类型
开发前的准备:首先需要读一下开发文档,调用任何接口前都应该仔细看看人家的开发文档,我们可以得到知道,发送红包不是根据微信号,而是根据openid,openid的获取是调用微信网页授权的接口看这里,另外需要微信商户,提前开通现金红包功能,跟以前一样要设置ip白名单;
先上一波成功图:

好了重点来了开始开发
假设你已经设置好了ip白名单,已经拿到了用户openid还有商户号,商户key有SDK的话很简单一段代码就实现了先简单点实现功能,再去读前辈写的SDK研究代码,通过查找SDK里有封装好的apiSDK
1/2现金红包br341.发送频率限制------默认1800/minbr52.发送个数上限------按照默认1800/min算br63.金额上限------根据传入场景id不同默认上限不同,可以在商户平台产品设置进行设置和申请,最大不大于4999元/个br74.其他的“量”上的限制还有哪些?------用户当天的领取上限次数,默认是10br85.如果量上满足不了我们的需求,如何提高各个上限?------金额上限和用户当天领取次数上限可以在商户平台进行设置br9注br101:如果你是服务商,希望代你的特约商户发红包,你可以申请获得你特约商户的“现金红包产品授权”。操作路径如下:【登录商户平台-产品中心-11特约商户授权产品】(即将上线)br122:红包金额大于200时,请求参数scene_id必传1314@paramsendredpack15sendredpack16@paramkey17key18@returnSendredpackResult19/20publicstaticSendredpackResultmmpaymkttransfersSendredpack(Sendredpacksendredpack,Stringkey){21MapString,Stringmap=MapUtil.objectToMap(sendredpack);22Stringsign=SignatureUtil.generateSign(map,sendredpack.getSign_type(),key);23sendredpack.setSign(sign);24StringsecapiPayRefundXML=XMLConverUtil.convertToXML(sendredpack);25HttpUriRequesthttpUriRequest=RequestBuilder.post()26.setHeader(xmlHeader)27.setUri(baseURI()+"/mmpaymkttransfers/sendredpack")28.setEntity(newStringEntity(secapiPayRefundXML,Charset.forName("utf-8")))29.build();30returnLocalHttpClient.keyStoreExecuteXmlResult(sendredpack.getMch_id(),httpUriRequest,SendredpackResult.class,sendredpack.getSign_type(),key);31}简单看一下需要传入参数,一个是封装好的红包实体类一个是商户Key
开始写
1//兑换微信红包23Sendredpackredpack=newSendredpack();//微信红包信息4redpack.setNonce_str(UUID.randomUUID().toString());//随机字符串5redpack.setMch_billno(UUID.randomUUID().toString());//商户单号6redpack.setMch_id(mch_id);//商户号7redpack.setWxappid(wxappid);//公众号appid8redpack.setSend_name(send_name);//商户名称9redpack.setRe_openid(user.getOpenid());//用户openid10redpack.setTotal_amount(wxred.getRmb()num100);//付款金额11redpack.setTotal_num(total_num);//红包发送人数12redpack.setWishing("恭喜您兑换成功!");//红包祝福语13redpack.setClient_ip(localIp());//ip地址14redpack.setAct_name("积分兑换红包活动");//活动名称15redpack.setRemark("备注");//备注16SendredpackResultresult=PayMchAPI.mmpaymkttransfersSendredpack(redpack,key);17if(result==null){18returnajax;//未知错误1920}21System.out.println("返回数据");22System.out.println("返回信息:"+result.getReturn_msg()+"返回状态码:"+result.getReturn_code()+"业务结果:"+result.getResult_code()+"错误代码:"+result.getErr_code()+"错误代码描述:"+result.getErr_code_des());2324if(!"SUCCESS".equals(result.getReturn_code())){25ajax.setMsg(result.getReturn_msg());//错误原因2627ajax.setData(result);28returnajax;29}按道理说这么写没问题然而,请求api方法的时候报错了,说是找不到类org.apache.http.util.Args,看了看项目是引用的HttpClientjar冲突了,因为SDK里也引用的有这个包删除ok,接着走问题来了这时候报了一个空指针,是SDK里报的,这就纳闷了,写好的SDK怎么会报空指针。顺着代码打断点调试,发现问题了,是因为调用微信这个接口的时候需要从连接池里获取一个连接,但是连接池是空的,所以空指针了,恩,现在需要做的,就是初始化连接池在Git上看到了设置APIHttpClient请求池大小的代码
1LocalHttpClient.init(100,10);2LocalHttpClient.initMchKeyStore("1329266801","C:\Users\Administrator\Desktop\cert\apiclient_cert.p12");3LocalHttpClient.setTimeout(5000);45//@since2.7.067//异常重试次数289LocalHttpClient.setRetryExecutionCount(2);10//设置请求连接池好了,前边是商户id后边是证书位置
在测试一波,,还是没有成功
看日志

看到了我们传递给微信的数据所有的数据都在没有空数据
接着看
这就有点坑了,微信文档明明是说返回sunccess就是成功,明明说单号长度可以为32位我才用了UUid好了不多说,看到了成功的希望,改下继续
这个参数也是有的长度也没有超出,不知道为什么给我报了错,参数长度减少了一点好了

到此为止,借用SDK的情况下,实现了微信公众号现金红包的功能,
但是这显然不是我们所想的,因为我们对实现过程一无所知,所以我决定应该往下看,看看SDK里是怎么实现的,读人家的代码

版权声明

即速应用倡导尊重与保护知识产权。如发现本站文章存在版权问题,烦请提供版权疑问、身份证明、版权证明、联系方式等发邮件至197452366@qq.com ,我们将及时处理。本站文章仅作分享交流用途,作者观点不等同于即速应用观点。用户与作者的任何交易与本站无关,请知悉。

产品经理

手机 : 13312967497

擅长 : 小程序流量变现

扫码领取礼包

热门模板

  • 头条
  • 搜狐
  • 微博
  • 百家
  • 一点资讯
  • 知乎