Java微信开发之现金红包接口
2023-09-14 08:57:15 时间
首先,商户调用微信红包接口时,服务器会进行证书验证,所以要在商户平台下载证书。在管理后台的“账户信息”里找到“安全设置”就可以下载了证书了。
商户平台:https://pay.weixin.qq.com
我们把下载好的证书解压放到目录D:/certs下。SSL接口中使用到这些证书。
接着就是向帐号中充值,因为发放现金红包将扣除商户的可用余额,所以需要预先充值,确保可用余额充足。进入“资金管理”菜单找到“现金管理”,在此进行充值,保证帐号有余额可以进行红包发放。
package com.benben.timetable.wechat.entity; * 现金红包 * @ClassName: SendRedPack * @Description: TODO * @author 潘广伟(笨笨) * @date 2015年12月11日 public class SendRedPack { private String nonce_str;// 随机字符串 private String sign;// 签名 private String mch_billno;// 商户订单号 private String mch_id;// 商户号 private String wxappid;// 公众账号 private String send_name;// 商户名称 private String re_openid;// 用户 private int total_amount;// 付款金额 private int total_num;// 红包发放总人数 private String wishing;// 红包祝福语 private String client_ip;// Ip地址 private String act_name;// 活动名称 private String remark;// 备注 public int getTotal_amount() { return total_amount; public void setTotal_amount(int total_amount) { this.total_amount = total_amount; public int getTotal_num() { return total_num; public void setTotal_num(int total_num) { this.total_num = total_num; public String getNonce_str() { return nonce_str; public void setNonce_str(String nonce_str) { this.nonce_str = nonce_str; public String getSign() { return sign; public void setSign(String sign) { this.sign = sign; public String getMch_billno() { return mch_billno; public void setMch_billno(String mch_billno) { this.mch_billno = mch_billno; public String getMch_id() { return mch_id; public void setMch_id(String mch_id) { this.mch_id = mch_id; public String getWxappid() { return wxappid; public void setWxappid(String wxappid) { this.wxappid = wxappid; public String getSend_name() { return send_name; public void setSend_name(String send_name) { this.send_name = send_name; public String getRe_openid() { return re_openid; public void setRe_openid(String re_openid) { this.re_openid = re_openid; public String getWishing() { return wishing; public void setWishing(String wishing) { this.wishing = wishing; public String getClient_ip() { return client_ip; public void setClient_ip(String client_ip) { this.client_ip = client_ip; public String getAct_name() { return act_name; public void setAct_name(String act_name) { this.act_name = act_name; public String getRemark() { return remark; public void setRemark(String remark) { this.remark = remark;
再次吐槽微信的xml格式。下划线啊!!!
public String createSendRedPackOrderSign(SendRedPack redPack){ StringBuffer sign = new StringBuffer(); sign.append("act_name=").append(redPack.getAct_name()); sign.append(" client_ip=").append(redPack.getClient_ip()); sign.append(" mch_billno=").append(redPack.getMch_billno()); sign.append(" mch_id=").append(redPack.getMch_id()); sign.append(" nonce_str=").append(redPack.getNonce_str()); sign.append(" re_openid=").append(redPack.getRe_openid()); sign.append(" remark=").append(redPack.getRemark()); sign.append(" send_name=").append(redPack.getSend_name()); sign.append(" total_amount=").append(redPack.getTotal_amount()); sign.append(" total_num=").append(redPack.getTotal_num()); sign.append(" wishing=").append(redPack.getWishing()); sign.append(" wxappid=").append(redPack.getWxappid()); sign.append(" key=").append(payKey); return DigestUtils.md5Hex(sign.toString()).toUpperCase(); }
签名算法请参考:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
之前微信支付也用到相同的签名方式:http://blog.csdn.net/jrainbow/article/details/49904065
private String ssl(String url,String data){ StringBuffer message = new StringBuffer(); try { KeyStore keyStore = KeyStore.getInstance("PKCS12"); FileInputStream instream = new FileInputStream(new File("D:/certs/apiclient_cert.p12")); keyStore.load(instream, mchId.toCharArray()); // Trust own CA and all self-signed certs SSLContext sslcontext = SSLContexts.custom() .loadKeyMaterial(keyStore, mchId.toCharArray()) .build(); // Allow TLSv1 protocol only SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( sslcontext, new String[] { "TLSv1" }, null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); CloseableHttpClient httpclient = HttpClients.custom() .setSSLSocketFactory(sslsf) .build(); HttpPost httpost = new HttpPost(url); httpost.addHeader("Connection", "keep-alive"); httpost.addHeader("Accept", "*/*"); httpost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); httpost.addHeader("Host", "api.mch.weixin.qq.com"); httpost.addHeader("X-Requested-With", "XMLHttpRequest"); httpost.addHeader("Cache-Control", "max-age=0"); httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) "); httpost.setEntity(new StringEntity(data, "UTF-8")); System.out.println("executing request" + httpost.getRequestLine()); CloseableHttpResponse response = httpclient.execute(httpost); 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) { message.append(text); EntityUtils.consume(entity); } catch (IOException e) { e.printStackTrace(); } finally { response.close(); } catch (Exception e1) { e1.printStackTrace(); return message.toString(); }
注意:微信本身提供的demo中的ssl程序是不正确的。
public Map String, String sendRedPack(SendRedPack redPack) throws Exception{ String sign = createSendRedPackOrderSign(redPack); redPack.setSign(sign); xmlUtil.xstream().alias("xml", redPack.getClass()); String xml = xmlUtil.xstream().toXML(redPack); String response = ssl(sendEedPackUrl,xml); Map String, String responseMap = xmlUtil.parseXml(response); return responseMap; }
java接口总结 接口声明:interface 接口的名字 接口体:接口体中包含常量的声明(没有变量)和抽象方法(没有普通方法)两部分。
相关文章
- Java反射机制(三):调用对象的私有属性和方法
- [Java 基础] 使用java.util.zip包压缩和解压缩文件
- JAVA 注解教程(四)Java 预置的注解
- Java实现 LeetCode 420 强密码检验器
- java实现测量到的工程数据
- java实现第六届蓝桥杯分机号
- java实现第七届蓝桥杯圆圈舞
- Java实现判断单联通(强连通缩点+拓扑排序)Going from u to v or from v to u
- Java实现John's trip(约翰的小汽车)
- Java实现蓝桥杯历届试题格子刷油漆
- Java实现洛谷 P1616 疯狂的采药
- java中使用相对路径读取文件的写法总结 ,以及getResourceAsStream() (转)
- Java接口和抽象类区别
- java 15: 用jshell体验交互式java编程
- linux系统部署Java程序获取ip时报Caused by: java.net.UnknownHostException: XXXXXXXXXX: XXXXXXXXXX: Name or service not known
- Java接口和抽象类区别
- Java扑克牌(斗地主,手中牌的排序)【Comparator】
- java 接口和抽象类的一个最大的区别
- JAVA设计模式之单例模式
- java三种匿名的方式开启线程
- Java中List与Set相互转化
- Java面向对象基础二
- Java程序猿从笨鸟到菜鸟之(九十二)深入java虚拟机(一)——java虚拟机底层结构具体解释
- 在java.util中有EventListener接口:所有事件监听者都要实现这个接口。
- Java 接口
- Java 数组
- java中请给一个Abstract类实现接口的实例!
- Java中如何动态创建接口的实现
- 深入解析Java适配器模式:将接口转换为你所需要的形式
- 【java】Java 中泛型的实现原理
- 【java】Java 封装
- Java 嵌入数据引擎从 SQLite 到 SPL详解