微信紅包接口開發


 

微信紅包接口官方文檔

接口文檔地址:https://pay.weixin.qq.com/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 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("響應字節總長度: " + 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{
 
    /**
     * 調用微信發送紅包接口
     * 微信官方接口文檔說明2018年1月4日:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_1
     * 微信調用結果成功返回案例2018年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[0010010404201411170000046545]]></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>
     * 微信調用結果失敗返回案例2018年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[0010010404201411170000046542]]></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 stub
        Map<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");//現金紅包接口返回的xml
            System.out.println("調用微信接口返回數據:" + xmlResult);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    @Test
    public 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.weixin.qq.com申請的),不能為APP的appid(在open.weixin.qq.com申請的)。
        rh.setParameter("send_name", "");//商戶名稱
        rh.setParameter("re_openid", "");//用戶openid  接受紅包的用戶用戶在wxappid下的openid
        rh.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);
 
    }
 
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM