微信公众号开发系列之发送红包-java版本

tips:代码我已经上传到github上了:https://github.com/sangbobo/WeChatSendRedPack

转载请注明出处: SangBigYe:http://blog.csdn.net/cutelittlebo/article/details/53874450

首先是罗列一下基本的开发步骤。

  • 前期准备
    1、有一个公众号
    2、开通微信支付功能
    3、进入产品中心、开通红包 功能(随便选一个渠道,后面能再更改)
    4、进入账户中心-账户设置-API安全-下载证书(这里只用到里面的apiclient_cert.p12证书)。
    5、进入账户中心-账户设置-API安全-设置API密钥(输入一个32的密钥,随便输入一个,但是自己一定要记住,设置后是不能查看的。)。
    6、充值一定的金额(红包最少发送一块钱。。。)

  • 开发阶段准备
    参考:微信的红包发放接口:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3

用到的jar包: jar包说明
commons-lang3-3.4.jar 文本处理
httpcore-4.4.jar https相关
json-20090211.jar json相关
okhttp-3.5.0.jar http请求相关
okio-1.11.0.jar okhttp依赖
  • 正式开发阶段

    public static void main(String[] args) throws Exception {


        //具体参数查看具体实体类,实体类中的的参数参考微信的红包发放接口,这里你直接用map,进行设置参数也可以。。。
        SendRedPack sendRedPack = new SendRedPack(
                "随机字符串不超过32位",
                "随机订单号,不超过32位",
                "商户号",
                "公众号appid",
                "桑博",
                "填写接受人的openid",
                100,
                1,
                "萌萌哒",
                "127.0.0.1",
                "桑博红包",
                "桑博",
                "PRODUCT_5"
        );


        //将实体类转换为url形式
        String urlParamsByMap = Tool.getUrlParamsByMap(Tool.toMap(sendRedPack));
        //拼接我们再前期准备好的API密钥,前期准备第5条
        urlParamsByMap += "&key=填写API密钥";
        //进行签名,需要说明的是,如果内容包含中文的话,要使用utf-8进行md5签名,不然会签名错误
        String sign = Tool.parseStrToMd5L32(urlParamsByMap).toUpperCase();
        sendRedPack.setSign(sign);
        //微信要求按照参数名ASCII字典序排序,这里巧用treeMap进行字典排序
        TreeMap treeMap = new TreeMap(Tool.toMap(sendRedPack));
        //然后转换成xml格式
        String soapRequestData = Tool.getSoapRequestData(treeMap);
        //发起请求前准备
        RequestBody body = RequestBody.create(MediaType.parse("text/xml;charset=UTF-8"), soapRequestData);
        Request request = new Request.Builder()
                .url("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack")
                .post(body)
                .build();
        //为http请求设置证书
        SSLSocketFactory socketFactory = getSSL().getSocketFactory();
        X509TrustManager x509TrustManager = Platform.get().trustManager(socketFactory);
        OkHttpClient okHttpClient = new OkHttpClient.Builder().sslSocketFactory(socketFactory, x509TrustManager).build();
        //得到输出内容
        Response response = okHttpClient.newCall(request).execute();
        String content = response.body().string();
        System.out.println(content);

1、关于total_amout,此处略坑,100 == 1元钱 ,也就是说 这里的 1 相当于1分钱,所以大家做好处理。微信发送红包不少于1元钱。

2、关于使用中文签名错误,一定要使用utf-8进行md5。

    public static SSLContext getSSL() throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException, UnrecoverableKeyException, KeyManagementException {
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        //证书位置自己定义
        FileInputStream instream = new FileInputStream(new File("D:/soft/apiclient_cert.p12"));
        try {
            keyStore.load(instream, "填写证书密码,默认为商户号".toCharArray());
        } finally {
            instream.close();
        }
        SSLContext sslcontext = SSLContexts.custom()
                .loadKeyMaterial(keyStore, "填写证书密码,默认为商户号".toCharArray())
                .build();
        return sslcontext;
    }
  • 总结

    详细的代码我已经上传到github上了:https://github.com/sangbobo/WeChatSendRedPack

    大家如果有什么问题,欢迎进行提问。

你可能感兴趣的:(微信,java)