亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

java微信公眾號支付開發之現金紅包

2024-07-14 08:40:21
字體:
來源:轉載
供稿:網友

我們先來看看公眾號發放現金紅包的效果:

java,微信公眾號,支付開發,java微信公眾號開發,java微信現金紅包,微信公眾號現金紅包

需要調用商戶平臺的接口,接口發放規則如下:

1.發送頻率限制——默認1800/min
2.發送個數上限——按照默認1800/min算
3.金額上限——根據傳入場景id不同默認上限不同,可以在商戶平臺產品設置進行設置和申請,最大不大于4999元/個
4.其他的“量”上的限制還有哪些?——用戶當天的領取上限次數,默認是10
5.如果量上滿足不了我們的需求,如何提高各個上限?——金額上限和用戶當天領取次數上限可以在商戶平臺進行設置
注意-紅包金額大于200時,請求參數scene_id必傳,參數說明見下文。
注意2-根據監管要求,新申請商戶號使用現金紅包需要滿足兩個條件:1、入駐時間超過90天 2、連續正常交易30天。

請求Url https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack
是否需要證書 是(證書及使用說明詳見商戶證書)
請求方式 POST

請求數據示例:

 

<xml><sign><![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]></sign><mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno><mch_id><![CDATA[888]]></mch_id><wxappid><![CDATA[wxcbda96de0b165486]]></wxappid><send_name><![CDATA[send_name]]></send_name><re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid><total_amount><![CDATA[200]]></total_amount><total_num><![CDATA[1]]></total_num><wishing><![CDATA[恭喜發財]]></wishing><client_ip><![CDATA[127.0.0.1]]></client_ip><act_name><![CDATA[新年紅包]]></act_name><remark><![CDATA[新年紅包]]></remark><scene_id><![CDATA[PRODUCT_2]]></scene_id><consume_mch_id><![CDATA[10000097]]></consume_mch_id><nonce_str><![CDATA[50780e0cca98c8c8e814883e5caa672e]]></nonce_str><risk_info>posttime%3d123123412%26clientversion%3d234134%26mobile%3d122344545%26deviceid%3dIOS</risk_info></xml>

接口需要調用商戶平臺的證書,證書需要去商戶平臺下載:

java,微信公眾號,支付開發,java微信公眾號開發,java微信現金紅包,微信公眾號現金紅包

然后在接口中使用證書,首先我們新建一個WeixinSSL 類

@Componentpublic class WeiXinSSL {  /**   * 證書類型   */  @Value("${werchant.storekey}")  private String storekey;  /**   * 文件路徑   */  @Value("${werchant.ssLfile}")  private String ssLfile;  /**   * 商戶號   */  @Value("${werchant.merchantNumber}")  private String merchantNumber;  public String getStorekey() {    return storekey;  }  public void setStorekey(String storekey) {    this.storekey = storekey;  }  public String getSsLfile() {    return ssLfile;  }  public void setSsLfile(String ssLfile) {    this.ssLfile = ssLfile;  }  public String getMerchantNumber() {    return merchantNumber;  }  public void setMerchantNumber(String merchantNumber) {    this.merchantNumber = merchantNumber;  }  }

封裝HttpClientSSL 類實現 https 請求加證書:

 

@Componentpublic class HttpClientSSL {  @Autowired  private WeiXinSSL weiXinSSL;  // 請求超時時間(毫秒) 5秒  public static RequestConfig requestConfig;  // 響應超時時間(毫秒) 60秒  public static int HTTP_RESPONSE_TIMEOUT = 60 * 1000;  // httpClient字符編碼  public static String encoding = "UTF-8";  public static RequestConfig getRequestConfig() {    return RequestConfig.custom().setConnectTimeout(5 * 1000)        .setConnectionRequestTimeout(HTTP_RESPONSE_TIMEOUT).build();  }  public static void setRequestConfig(RequestConfig requestConfig) {    HttpClientSSL.requestConfig = requestConfig;  }  /**   * https請求偽造證書   * @return   */  public CloseableHttpClient defaultSSLClient() {    SSLContext sslContext = null;    try {      new SSLContextBuilder().loadTrustMaterial(null,new TrustStrategy(){        @Override        public boolean isTrusted(X509Certificate[] chain, String authType)            throws java.security.cert.CertificateException {          return false;        }      });    } catch (NoSuchAlgorithmException | KeyStoreException e) {      e.printStackTrace();    }    SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(sslContext);    return HttpClients.custom().setSSLSocketFactory(factory).build();  }  /**   * https請求加證書   * @return   */  public CloseableHttpClient defaultSSLClientFile() {    if (this.weiXinSSL == null){      return this.defaultSSLClient();    }    FileInputStream inputStream = null;    KeyStore keyStore = null;    try {      // ssl類型      keyStore = KeyStore.getInstance(weiXinSSL.getStorekey());      // ssl文件      inputStream = new FileInputStream(weiXinSSL.getSsLfile());      // 設置ssl密碼      keyStore.load(inputStream,weiXinSSL.getMerchantNumber().toCharArray());    } catch (KeyStoreException | NoSuchAlgorithmException | CertificateException | IOException e1) {      e1.printStackTrace();    } finally {      try {        inputStream.close();      } catch (IOException e) {        e.printStackTrace();      }    }    SSLContext sslContext = null;    try {      sslContext = SSLContexts.custom().loadKeyMaterial(keyStore,weiXinSSL.getMerchantNumber().toCharArray()).build();    } catch (UnrecoverableKeyException | NoSuchAlgorithmException | KeyStoreException | KeyManagementException e) {      e.printStackTrace();    }    SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(sslContext, new String[] { "TLSv1" }, null,        SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);    return HttpClients.custom().setSSLSocketFactory(factory).build();  }  /**   * 封裝發送請求的方法   * @throws UnsupportedEncodingException   */  public String send(String url, String data, CloseableHttpClient closeableHttpClient)      throws UnsupportedEncodingException {    CloseableHttpClient client = closeableHttpClient;    HttpPost httpPost = new HttpPost(URLDecoder.decode(url, encoding));    httpPost.addHeader("Connection", "keep-alive");    httpPost.addHeader("Accept", "*/*");    httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");    httpPost.addHeader("Host", "api.mch.weixin.qq.com");    httpPost.addHeader("X-Requested-With", "XMLHttpRequest");    httpPost.addHeader("Cache-Control", "max-age=0");    httpPost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");    httpPost.setConfig(this.getRequestConfig());// 設置超時時間    CloseableHttpResponse response = null;    // 參數放入    StringEntity entity = new StringEntity(data, encoding);    entity.setContentEncoding(encoding);    entity.setContentType("application/xml");    httpPost.setEntity(entity);    try {      response = client.execute(httpPost);      if (response.getStatusLine().getStatusCode() == 200) {        HttpEntity httpEntity = (HttpEntity) response.getEntity();        if (response != null) {          return EntityUtils.toString(httpEntity,encoding);        }      }    } catch (IOException e) {      e.printStackTrace();    }    return null;  }}  

這樣我們就封裝了一個https請求加證書的實體類,接下來我們生成請求微信紅包接口:
https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack 的參數簽名:

/*** 紅包參數實體類 * @throws UnsupportedEncodingException */@Componentpublic class SendRedPack implements Serializable{  /**   *    */  private static final long serialVersionUID = -1000489228099916099L;  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 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 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 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;  }}

接下來是發送紅包的控制器:

/** * 領紅包控制器 * @author zengliang */@Controller@RequestMapping(value="/redenveLopesReceive")public class RedEnvelopesReceiveController {  //微信唯一標識  @Value("${weixin.appid}")  private String appid;  //微信開發者密碼標識  @Value("${weixin.appsecret}")  public String appsecret;  @Autowired  private SendRedPack sendredpack;  @Autowired  private HttpClientSSL httpclientssl;  /**   * 發送XML參數   * @author zengliang   */  @ResponseBody  @RequestMapping(value="/sendXml")  public String sendXml(String openid,Long redenveLopes_id      ,String mch_billno){    RedenveLopes redenve = redenveLopesService.findOne(redenveLopes_id);    XMLUtil xmlUtil= new XMLUtil();    sendredpack.setAct_name(redenve.getAct_name());    sendredpack.setNonce_str(xmlUtil.random());    sendredpack.setRe_openid(openid);    sendredpack.setClient_ip(redenve.getClient_ip());    sendredpack.setMch_billno(mch_billno);    sendredpack.setMch_id(redenve.getMch_id());    String xx = redenve.getRemark();    sendredpack.setRemark(StringUtils.isEmpty(xx) == false?xx:"空");    sendredpack.setSend_name(redenve.getSend_name());    sendredpack.setTotal_amount(redenve.getTotal_amount());    sendredpack.setTotal_num(redenve.getTotal_num());    sendredpack.setWishing(redenve.getWishing());    sendredpack.setWxappid(redenve.getWxappidxx());    //生成簽名    String params = this.createSendRedPackOrderSign(sendredpack,redenve.getStore_key());    sendredpack.setSign(params);    xmlUtil.xstream().alias("xml",sendredpack.getClass());    //擴展xstream,使其支持CDATA塊    String requestXml = xmlUtil.xstream().toXML(sendredpack);    String result;    try {      result = httpclientssl.send("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack",requestXml,httpclientssl.defaultSSLClientFile());      System.out.println("成功返回值"+result);      return result;    } catch (UnsupportedEncodingException e) {      e.printStackTrace();    }    return null;  }/**   * 生成簽名   * @param redPack   * @return   */  public String createSendRedPackOrderSign(SendRedPack redPack,String storekey){    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(storekey);    return DigestUtils.md5Hex(sign.toString()).toUpperCase();  }}

然后我們需要用一個解析XML的工具類實現解析微信返回的XML

 

/** * 解析XML工具類 * @author zengliang */@Componentpublic class XMLUtil {  /**   * 解析微信返回的XML   * @param xml   * @return   * @throws Exception   */  @SuppressWarnings("unchecked")  public Map<String, String> parseXml(String xml)throws Exception {    Map<String,String> map = new HashMap<String,String>();     Document doc = null;     try {       doc = DocumentHelper.parseText(xml); // 將字符串轉為XML       Element rootElt = doc.getRootElement(); // 獲取根節點       List<Element> list = rootElt.elements();//獲取根節點下所有節點       for (Element element : list) { //遍歷節點         map.put(element.getName(), element.getText()); //節點的name為map的key,text為map的value       }     } catch (DocumentException e) {       e.printStackTrace();     } catch (Exception e) {       e.printStackTrace();     }    return map;   }  /**   * 擴展xstream,使其支持CDATA塊   */   private XStream xstream = new XStream(new XppDriver(new NoNameCoder()) {      @Override      public HierarchicalStreamWriter createWriter(Writer out) {          return new PrettyPrintWriter(out) {          // 對所有xml節點的轉換都增加CDATA標記          boolean cdata = true;          @Override          @SuppressWarnings("rawtypes")          public void startNode(String name, Class clazz) {            super.startNode(name, clazz);          }          @Override          public String encodeNode(String name) {            return name;          }          @Override          protected void writeText(QuickWriter writer, String text) {            if (cdata) {              writer.write("<![CDATA[");              writer.write(text);              writer.write("]]>");            } else {              writer.write(text);            }          }          };      }   });   private XStream inclueUnderlineXstream = new XStream(new DomDriver(null,new XmlFriendlyNameCoder("_-", "_")));   public XStream getXstreamInclueUnderline() {     return inclueUnderlineXstream;   }   public XStream xstream() {     return xstream;   }   /**   * 生成隨機數   * @return   */  public String random(){    String random = UUID.randomUUID().toString().replace("-", "");    return random;  }}

然后我們調用 sendXML 方法公眾號就能向用戶發送紅包了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲性猛交xxxxwww| 久久九九全国免费精品观看| 亚洲精品99久久久久中文字幕| 欧美激情一区二区三级高清视频| 亚洲在线免费看| 麻豆国产va免费精品高清在线| 另类专区欧美制服同性| 色婷婷**av毛片一区| 夜夜嗨av一区二区三区免费区| 久久av中文字幕| 国产一区二区三区三区在线观看| 欧美亚洲在线播放| 国产精品久久久久久一区二区| 亚洲国内精品在线| 精品国产一区二区三区久久久| 亚洲美女av黄| 欧美大尺度电影在线观看| 亚洲精品动漫久久久久| 亚洲国产欧美精品| 国产精品入口免费视| 亚洲色图日韩av| 亚洲va久久久噜噜噜久久天堂| 欧美成人免费全部| 一区二区欧美亚洲| 亚洲精品www久久久久久广东| 欧美日韩亚洲精品内裤| 国产精品久久久久77777| 日韩电视剧免费观看网站| 欧美日韩亚洲国产一区| 成人天堂噜噜噜| 国产婷婷97碰碰久久人人蜜臀| 久久伊人精品天天| 国产精品亚洲片夜色在线| 精品动漫一区二区| 精品女同一区二区三区在线播放| 美日韩丰满少妇在线观看| 亚洲天堂视频在线观看| 91精品啪aⅴ在线观看国产| 欧美午夜精品久久久久久人妖| 日韩一区二区精品视频| 一区二区国产精品视频| 国产精品成人aaaaa网站| 精品久久久精品| 中文字幕在线看视频国产欧美| 久久99热精品| 亚洲欧美精品伊人久久| 亚洲精品日韩激情在线电影| 欧美午夜激情小视频| 精品香蕉在线观看视频一| 亚洲第一国产精品| 欧美午夜精品伦理| 2019av中文字幕| 亚洲综合最新在线| 亚洲综合成人婷婷小说| 97国产精品久久| 欧美日韩午夜视频在线观看| 亚洲欧美激情精品一区二区| 日韩精品中文在线观看| 欧美影院在线播放| 日本免费久久高清视频| 国产成人久久久精品一区| 色偷偷888欧美精品久久久| 91精品国产乱码久久久久久久久| 国产精品久久久久高潮| 日韩精品一二三四区| 琪琪亚洲精品午夜在线| 日韩欧美a级成人黄色| 欧美电影在线观看| 91精品国产综合久久久久久久久| 国产日产久久高清欧美一区| 亚洲色图综合网| 成人免费在线网址| 国产性色av一区二区| 欧美日韩一区二区免费视频| 国产精品久久久久影院日本| 国产精品免费小视频| 成人国产精品日本在线| 久色乳综合思思在线视频| 亚洲精品suv精品一区二区| 日韩在线视频二区| 亚洲精品在线91| 日韩精品免费一线在线观看| 欧美成人sm免费视频| 日韩视频精品在线| 一本色道久久综合狠狠躁篇怎么玩| 在线中文字幕日韩| 日韩av123| 欧美黄色片视频| 国产精品久久久av久久久| 国产精品久久久久久久久久小说| 成人精品视频久久久久| 国产精品福利片| 国产一区二区美女视频| 97在线视频免费播放| 久久亚洲精品小早川怜子66| 91精品久久久久久久久久另类| 韩国欧美亚洲国产| 97超碰色婷婷| 欧美视频国产精品| 亚洲a级在线观看| 国产精品久久久久久久久借妻| 精品成人国产在线观看男人呻吟| 国产精品xxxxx| 国产成人精品免费久久久久| 国产精品国产三级国产aⅴ浪潮| 久久久久久久久久国产| 亚洲免费一级电影| 欧美日韩国产一区中文午夜| 欧美激情国产日韩精品一区18| 欧美极品美女视频网站在线观看免费| 欧美在线精品免播放器视频| 国产精品欧美日韩久久| 成人免费视频网址| 美女国内精品自产拍在线播放| 午夜精品久久久久久久99热| 国产91成人在在线播放| 亚洲xxxxx性| 日韩精品免费观看| 国产区亚洲区欧美区| 国产做受69高潮| 久久精品男人天堂| 亚洲欧美日韩国产成人| 欧美激情一区二区三区在线视频观看| 国产精品亚发布| 亚洲精品女av网站| 欧美日韩久久久久| 中文字幕在线日韩| 亚洲综合自拍一区| 日韩色av导航| 亚洲人精品午夜在线观看| 成人欧美在线视频| 久久精品国产成人| 97精品一区二区视频在线观看| 久久免费视频这里只有精品| 欧美成人一区二区三区电影| www.日本久久久久com.| 亚洲最新av在线| 大桥未久av一区二区三区| 上原亚衣av一区二区三区| 国内精品免费午夜毛片| 奇米影视亚洲狠狠色| 亚洲最新av在线网站| 91亚洲精品在线观看| 日韩大陆毛片av| 精品少妇一区二区30p| 成人动漫网站在线观看| 日韩精品免费观看| 久久国产天堂福利天堂| 亚洲福利在线播放| 国产91av在线| 亚洲系列中文字幕| 久久精品小视频| 国产精品亚洲一区二区三区| 久久久爽爽爽美女图片| 亚洲国产91精品在线观看| 日韩精品视频在线观看网址| 欧美国产精品人人做人人爱| 性色av一区二区咪爱| 国产97在线视频| 欧美自拍视频在线观看| 欧美高清视频在线| 久久手机免费视频| 日韩电影免费在线观看| 91久久久久久久久久|