100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 微信现金红包接口对接

微信现金红包接口对接

时间:2019-12-24 02:28:25

相关推荐

微信现金红包接口对接

微信现金红包接口对接

前言

接到公司业务提出的需求,说公司的积分商城需要可以兑换现金,就是公众号给微信用户发送红包。对接的是发放普通红包接口。

开发前置了解

接口文档地址:https://pay./wiki/doc/api/tools/cash_coupon_sl.php?chapter=13_4&index=3

1)首先公司的商户号必须和公众号关联,而且只有用户关注了公众号才可以成功发放红包。因为红包是通过公众号发送的,如果没有关注怎么发?

2)下载商户号的证书,这个在发送请求的时候要证书连接。

3)商户号,公众号什么的这些基本参数就自己去看文档。

代码实现

由于这个关系到公司的安全问题,所有只展示关键代码。

/*** 微信请求参数处理类* @author vip**/public class RequestHandler {public RequestHandler() {parameters = new HashMap<String, String>();}protected Map<String, String> parameters;//通过该参数设置微信接口需要的参数public void setParameter(String parameter, String parameterValue) {if (parameter != null && parameter != "") {if (parameters.containsKey(parameter)) {parameters.remove(parameter);}parameters.put(parameter, parameterValue);}}/// <summary>/// 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名/// </summary>/// <param name="key">参数名</param>/// <param name="value">参数值</param>/// key和value通常用于填充最后一组参数/// <returns></returns>public String createMd5Sign(String key, String value) {StringBuilder sb = new StringBuilder();List<String> akeys = new ArrayList<String>(parameters.keySet());Collections.sort(akeys);for (String k : akeys) {String v = parameters.get(k);if (null != v && "".compareTo(v) != 0&& "sign".compareTo(k) != 0 && "key".compareTo(k) != 0) {sb.append(k + "=" + v + "&");}}sb.append(key + "=" + value);//最后拼接秘钥System.out.println("签名拼接的字符串" + sb.toString());return MD5.MD5Encode(sb.toString()).toUpperCase();}/// <summary>/// 输出XML/// </summary>/// <returns></returns>public String parseXML() {StringBuilder sb = new StringBuilder();sb.append("<xml>");for (String k : parameters.keySet()) {String v = parameters.get(k);sb.append("<" + k + "><![CDATA[" + v + "]]></" + k + ">");}sb.append("</xml>");return sb.toString();}public Map<String, String> getParameters() {return parameters;}public void setParameters(Map<String, String> parameters) {this.parameters = parameters;}}

/*** HTTP 请求工具类*/public class HttpUtil {/*** 针对微信发送请求,前置需要使用证书,如果不需要使用证书请不要使用这个接口* @param apiUrl* @param data<XML格式>* @param cert 使用的证书路径* @param mchId 证书密码默认为您的商户ID(如:10010000)* @return*/public static String doPostByWXSSL(String url, String data, String certPath, String mchId) {StringBuffer message = new StringBuffer();try {KeyStore keyStore = KeyStore.getInstance("PKCS12");FileInputStream instream = new FileInputStream(new File(certPath));//使用的证书keyStore.load(instream, mchId.toCharArray());// Trust own CA and all self-signed certsSSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mchId.toCharArray()).build();// Allow TLSv1 protocol onlySSLConnectionSocketFactory 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.");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("响应字节总长度: " + entity.getContentLength());BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent(),"UTF-8"));String text;while ((text = bufferedReader.readLine()) != null) {message.append(text);}}System.out.println("--------------------发送微信接收参数结束--------------------");EntityUtils.consume(entity);} catch (IOException e) {e.printStackTrace();} finally {response.close();}} catch (Exception e1) {e1.printStackTrace();}return message.toString();}}

public class WXRedPacket{/*** 调用微信发送红包接口* 微信官方接口文档说明1月4日:https://pay./wiki/doc/api/tools/cash_coupon.php?chapter=13_1* 微信调用结果成功返回案例1月4日:* <xml> * <return_code><![CDATA[SUCCESS]]></return_code> * <return_msg><![CDATA[发放成功.]]></return_msg> * <result_code><![CDATA[SUCCESS]]></result_code> * <err_code><![CDATA[0]]></err_code> * <err_code_des><![CDATA[发放成功.]]></err_code_des> * <mch_billno><![CDATA[001001040411170000046545]]></mch_billno> * <mch_id>10010404</mch_id> * <wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid> * <re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid> * <total_amount>1</total_amount> * </xml> * 微信调用结果失败返回案例1月4日:* <xml> * <return_code><![CDATA[FAIL]]></return_code> * <return_msg><![CDATA[系统繁忙,请稍后再试.]]></return_msg> * <result_code><![CDATA[FAIL]]></result_code> * <err_code><![CDATA[268458547]]></err_code> * <err_code_des><![CDATA[系统繁忙,请稍后再试.]]></err_code_des> * <mch_billno><![CDATA[001001040411170000046542]]></mch_billno> * <mch_id>10010404</mch_id> * <wxappid><![CDATA[wx6fa7e3bab7e15415]]></wxappid> * <re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid> * <total_amount>1</total_amount> * </xml> * @param RequestHandler* @return*/public void sendRedPacket(RequestHandler rh) {// TODO Auto-generated method stubMap<String, String> result = new HashMap<String, String>();try {String sign = rh.createMd5Sign("key", "秘钥");//key,秘钥和值根据微信加密规则加密签名rh.setParameter("sign", sign);//设置签名到请求参数中String data = rh.parseXML();//调用现金红包接口需要的数据XML格式String xmlResult = HttpUtil.doPostByWXSSL("接口地址", data, "证书路径", "mchid");//现金红包接口返回的xmlSystem.out.println("调用微信接口返回数据:" + xmlResult);} catch (Exception e) {e.printStackTrace();}}@Testpublic void test1() {RequestHandler rh = new RequestHandler();rh.setParameter("nonce_str", "");//随机字符串,不长于32位rh.setParameter("mch_billno", "");//商户订单号(每个订单号必须唯一)组成:mch_id+yyyymmdd+10位一天内不能重复的数字。接口根据商户订单号支持重入,如出现超时可再调用。rh.setParameter("mch_id", "");//微信支付分配的商户号rh.setParameter("wxappid", "");//微信分配的公众账号ID(企业号corpid即为此appId)。接口传入的所有appid应该为公众号的appid(在mp.申请的),不能为APP的appid(在open.申请的)。 rh.setParameter("send_name", "");//商户名称rh.setParameter("re_openid", "");//用户openid 接受红包的用户用户在wxappid下的openidrh.setParameter("total_amount", "");//付款金额 单位分rh.setParameter("total_num", "");//红包发放总人数rh.setParameter("wishing", "");//红包祝福语rh.setParameter("client_ip", "");//Ip地址rh.setParameter("act_name", "");//活动名称rh.setParameter("remark", "");//备注rh.setParameter("scene_id", "");//场景id,发放红包使用场景,红包金额大于200时必传,PRODUCT_1:商品促销 ,PRODUCT_2:抽奖 ,PRODUCT_3:虚拟物品兑奖 ,PRODUCT_4:企业内部福利 ,PRODUCT_5:渠道分润 ,PRODUCT_6:保险回馈 ,PRODUCT_7:彩票派奖 ,PRODUCT_8:税务刮奖rh.setParameter("risk_info", "");//活动信息,posttime:用户操作的时间戳 ,mobile:业务系统账号的手机号,国家代码-手机号。不需要+号 ,deviceid :mac 地址或者设备唯一标识 ,clientversion :用户操作的客户端版本 ,把值为非空的信息用key=value进行拼接,再进行urlencode ,urlencode(posttime=xx& mobile =xx&deviceid=xx)rh.setParameter("consume_mch_id", "");//资金授权商户号,服务商替特约商户发放时使用sendRedPacket(rh);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。