这几天看了下以前写的有关微信支付的博客,看的人仍是挺多的,看了下留言不知道是由于博客写的不够细仍是什么状况,大多都找我要源码,我以为吧程序员仍是须要有这么一个思考的过程,所以没直接给源码,俗话说“授人以鱼不如授人以渔”。所以但愿看文章的同时也花一点时间本身亲自敲一敲代码。好了废话很少说此次来分享微信现金红包接口的使用。php
下面是微信开发文档对现金红包的介绍:java
现金红包,是微信支付商户平台提供的营销工具之一,上线以来深受广大商户与用户的喜好。商户能够经过本平台向微信支付用户发放现金红包。用户领取红包后,资金到达用户微信支付零钱帐户,和零钱包的其余资金有同样的使用出口;若用户未领取,资金将会在24小时后退回商户的微信支付帐户中。
程序员
产品意义
微信支付现金红包因资金的承载方式为现金,一直以来深受用户的青睐,近年来的春晚中,现金红包都扮演着重要的角色;在平常运营中也为商户的营销活动带来热烈的反响。总的来讲,现金红包在包括但不只限于如下场景中发挥着重要意义: 算法
◆ 为企业拉取新用户、巩固老用户关系、提高用户活跃度
◆ 结合巧妙的创意点子,辅以红包点缀,打造火爆的活动,提高企业与品牌知名度
◆ 结合企业运营活动,以红包做为奖品,使你的抽奖、满送等营销活动更便利进行
◆ 同时,除了营销以外,现金红包在企业平常的运营中也扮演着重要角色。如:为员工返福利、为供应商返利、会员积分/虚拟等级兑现等等 综上所述微信现金红包是一种营销工具,能够经过关注公众号、注册等给用户发放增长用户粘性。此次着重从程序开发方面分享个人心得体会
一 使用微信现金红包功能需具有的条件api
1 拥有微信商户平台且秘钥证书齐全微信
2 商户平太须要有足够的余额可供使用(不够能够从商户平台使用财付通充值)微信开发
3 有微信支付开发基础更佳app
二 开发的重点和难点工具
1 微信签名算法微信支付
2 httpclient以及证书的使用
若是有微信h5支付或扫码支付的童鞋看这一部分的文档能够说是小菜一碟,理解起来不费吹灰之力,同时只要掌握httpclient的知识就万事俱备了
三 直接撸代码
public static void sendRedPack(String mch_billno,String openId,String send_name,String total_fee,String total_num,String wishing,String act_name,String remark,String ip) throws Exception{
String non=PayCommonUtil.CreateNoncestr();
SortedMap p = new TreeMap();
p.put("nonce_str", non);
p.put("mch_billno", mch_billno);
p.put("mch_id", ConfigUtil.MCH_ID);
p.put("wxappid", ConfigUtil.APPID);
p.put("re_openid", openId);
p.put("total_amount", total_fee);
p.put("total_num", "1");
p.put("client_ip", "127.0.0.1");
p.put("act_name",act_name);
p.put("send_name", send_name);
p.put("wishing", wishing);
p.put("remark",remark);
String sign = PayCommonUtil.createSign("UTF-8", p);
System.out.println(sign);
p.put("sign", sign);
String reuqestXml = PayCommonUtil.getRequestXml(p);
KeyStore keyStore = KeyStore.getInstance("PKCS12");
FileInputStream instream = new FileInputStream(new File(ConfigUtil.CERT_PATH));
try {
keyStore.load(instream, ConfigUtil.MCH_ID.toCharArray());
} finally {
instream.close();
}
SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore,
ConfigUtil.MCH_ID.toCharArray()).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext, new String[] { "TLSv1" }, null,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf).build();
try {
HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack");// 退款接口
httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
System.out.println("executing request" + httpPost.getRequestLine());
//请求的xml需转码为iso8859-1编码,不然易出现签名错误或红包上的文字显示有误
StringEntity reqEntity = new StringEntity(new String(reuqestXml.getBytes(), "ISO8859-1"));
// 设置类型
httpPost.setEntity(reqEntity);
CloseableHttpResponse response = httpclient.execute(httpPost);
try {
HttpEntity entity = response.getEntity();
System.out.println("----------------------------------------");
System.out.println(response.getStatusLine());
if (entity != null) {
System.out.println("Response content length: "
+ entity.getContentLength());
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(entity.getContent(), "UTF-8"));
String text;
while ((text = bufferedReader.readLine()) != null) {
System.out.println(text);
}
}
EntityUtils.consume(entity);
} finally {
response.close();
}
} finally {
httpclient.close();
}
}
须要注意的地方是下面这里:
//请求的xml需转码为iso8859-1编码,不然易出现签名错误或红包上的文字显示有误
StringEntity reqEntity = new StringEntity(new String(reuqestXml.getBytes(), "ISO8859-1"));
这个地方能够说把我弄得差点崩溃了各类试,各类调试仍是抱着试一试的心态加上去就OK了,这个多是由于httpclient和原生的HttpsConnection在数据传输上的不一样吧。这里没作过多的研究。
调用这个方法就更简单了直接像下面这样
public static void main(String args[]){
try {
sendRedPack("12828839012016101420","接收者的openid","xxx","100","1","恭喜发财,年年有余","新年红包","新年红包还不快抢","127.0.0.1");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}红包发送后打印的信息以下:
TTP/1.1 200 OK
Response content length: 567
100