tips:代码我已经上传到github上了:https://github.com/sangbobo/WeChatSendRedPack
在文章的最后也推荐了一个微信java开发工具包WxJava,如果有需求的话,可自取。
转载请注明出处: 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上了:点击直达
推荐
WxJava:点击直达