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


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

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

    官方文档走一波

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

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

    先上一波成功图:

     

    好了重点来了 开始开发

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

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

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

    开始写

     1 //兑换微信红包
     2 
     3         Sendredpack  redpack=new Sendredpack();             //微信红包信息
     4         redpack.setNonce_str(UUID.randomUUID().toString()); //随机字符串
     5         redpack.setMch_billno(UUID.randomUUID().toString());//商户单号
     6         redpack.setMch_id(mch_id);                          //商户号
     7         redpack.setWxappid(wxappid);                        //公众号appid
     8         redpack.setSend_name(send_name);                    //商户名称
     9         redpack.setRe_openid(user.getOpenid());                         //用户openid
    10         redpack.setTotal_amount(wxred.getRmb()*num*100);            //付款金额
    11         redpack.setTotal_num(total_num);                    //红包发送人数
    12         redpack.setWishing("恭喜您兑换成功!");                 //红包祝福语
    13         redpack.setClient_ip(localIp());                //ip地址
    14         redpack.setAct_name("积分兑换红包活动");                //活动名称
    15         redpack.setRemark("备注");                            //备注
    16         SendredpackResult  result= PayMchAPI.mmpaymkttransfersSendredpack(redpack,key);
    17         if(result==null){
    18             return ajax;                                    //未知错误
    19 
    20         }
    21         System.out.println("************ 返回数据**************");
    22         System.out.println("返回信息:"+result.getReturn_msg()+" 返回状态码:"+result.getReturn_code()+" 业务结果:"+result.getResult_code()+"错误代码:"+result.getErr_code()+" 错误代码描述:"+result.getErr_code_des());
    23 
    24         if(!"SUCCESS".equals(result.getReturn_code())){
    25             ajax.setMsg(result.getReturn_msg());            //错误原因  
    26 
    27             ajax.setData(result);
    28             return ajax;
    29         } 

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

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

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

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

    看日志

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

    接着看


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


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

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

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

  • 相关阅读:
    qq客服不需要加好友
    mysql中表名为关键字的处理方法
    DIV+CSS最小高度(兼容IE6\IE7\FF)(转载)
    Js%26String添加加+trim()方法
    MS Sql 定期自动备份
    MySQL 中文显示乱码
    SQL Server 2005 中的Row_Number()函数
    Jquery中使用setInterval和setTimeout
    fieldset 居中
    script language="JavaScript" defer
  • 原文地址:https://www.cnblogs.com/haw2106/p/10345087.html
Copyright © 2020-2023  润新知