Давайте сначала рассмотрим влияние денежных красных конвертов, выпущенных официальным счетом:
Необходимо вызвать интерфейс торговой платформы, а правила распределения интерфейса следующие:
1. Отправить предел частоты - по умолчанию 1800/мин.
2. Верхний предел количества отправков - рассчитывается в соответствии с по умолчанию 1800/мин.
3.
4. Какие еще ограничения на «количество» существуют? - максимальное количество раз, когда пользователь получает в тот день по умолчанию 10, по умолчанию
5. Если количество не может удовлетворить наши потребности, как мы можем увеличить каждый верхний предел? -Максимальный предел суммы и максимальное количество раз, когда пользователь получает в тот же день, могут быть установлены на торговой платформе
Примечание. Когда сумма красной конверты превышает 200, необходимо передавать параметр запроса сцена с Scene_id, а описание параметра показано ниже.
ПРИМЕЧАНИЕ 2 - В соответствии с нормативными требованиями, для использования денежных красных конвертов необходимы два условия для вновь применяемых торговых счетов: 1. Время входа превышает 90 дней. 2. Непрерывные нормальные транзакции в течение 30 дней.
Запрос URL https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack
Требуется ли сертификат (для получения подробной информации см. Сертификат продавца)
Запрос пост
Запросить пример данных:
<xml> <cint> <! [Cdata [e1ee61a91c8e90f299de6ae075d60a2d]]> </sign> <mch_billno> <! [CDATA [0010010404201411170 000046545]]> </mch_billno> <MCH_ID> <! [CDATA [888]]> </mch_id> <wxappid> <! [CDATA [WXCBDA96DE0B165486]]] </WXAP pid> <send_name> <! [cdata [send_name]]> </send_name> <re_openid> <! [cdata [onqojjmm1tad-3ropncn-yufa6ui]]> </r e_openid> <total_amount> <! [CDATA [200]]> </total_amount> <total_num> <! [CDATA [1]]]> </total_num> <seliping> <! [CD Ata [поздравляю с разбога Envelope]]> </замечание> <schine_id> <! [CDATA [Product_2]]> </scene_id> <susume_mch_id> <! [CDATA [10 000097]]> </unsume_mch_id> <nonce_str> <! [CDATA [50780E0CCA98C8C8E814883E5CAA672E]]]> </nonce_str> <shrisch_inf o> posttime%3D123123412%26ClientVersion%3D234134%26Mobile%3D122344545%26Deviceid%3dios </risch_info> </xml>
Интерфейс требует вызова в сертификат торговой платформы, и сертификат должен быть загружен с торговой платформы:
Затем используйте сертификат в интерфейсе. Во -первых, мы создаем новый класс Weixinssl
@Componentpublic class weixinssl { / *** Тип сертификата* / @value ("$ {werchant.storekey}") private String Storekey; / *** pail path*/ @value ("$ {werchant.sslfile}") частная строка 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; // Timeout (миллисекунд) 5 секунд Public Static RequestCONFIG RequestConfig; // тайм -аут ответа (миллисекунды) 60 секунд общественный статический int http_response_timeout = 60 * 1000; // httpclient символ, кодирующий публичную статическую строку 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 Quebleablehttpclient defaultsslclient () {sslcontext sslcontext = null; try {new sslcontextbuilder (). } catch (nosuchalgorithmexception | KeyStoreException e) {e.printstackTrace (); } SslConnectionsockeCtectory factory = new sslConnectionsocketCactory (sslContext); return httpclients.custom (). setsslsocketfactory (factory) .build (); } / *** https Запрос, чтобы добавить сертификат* @return* / public Quebleablehttpclient defaultfileslcile () {if (this.weixinssl == null) {return this.defaultsslclient (); } FileInputStream inputStream = null; Key Store Store Store = null; try {// ssl type keystore = keystore.getinstance (weixinssl.getStorekey ()); // ssl file inputStream = new FileInputStream (weixinssl.getsslfile ()); // Установить SSL -файл пароля Store.load (InputStream, Weixinssl.getMerchantNumber (). ToCharRary ()); } catch (keyStoreException | nosuchalgorithmexception | setrateException | ioException e1) {e1.printstacktrace (); } наконец {try {inputStream.close (); } catch (ioException e) {e.printstackTrace (); }} SslContext sslContext = null; try {sslcontext = sslcontexts.custom (). } catch (UncoverableKeyException | noshuchalgorithmexception | KeyStoreException | KeyManagementException e) {e.printstackTrace (); } SslConnectionsockeCtectory factory = new sslConnectionsockectectory (sslContext, new String [] {"tlsv1"}, null, sslConnectionsockeCtectory.browser_compatible_hostname_verifier); return httpclients.custom (). setsslsocketfactory (factory) .build (); } / *** Инкапсулировать метод отправки запросов* @Throws UnsupportEncodingException* / public String Send (String URL, String Data, ClosableHttpClient rekableHttpClient) вызывает UnsupportedEncodingException {stocableHttpClient client = stockableHtpClient; Httppost httppost = new httppost (urldecoder.decode (url, кодирование)); 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 ("Контроль кэша", "max-age = 0"); httppost.addheader («Пользовательский агент», «Mozilla/4.0 (совместимый; msie 8.0; Windows NT 6.0)»); httppost.setConfig (this.getRequestConfig ()); // Установить тайм -аут closablehttpresponse response = null; // Поместите параметр в strongity entity = new строгость (данные, кодирование); Entity.SetContentEncoding (кодирование); Entity.SetContentType ("Application/XML"); httppost.setentity (сущность); try {response = client.execute (httppost); if (response.getStatusline (). getStatuscode () == 200) {httpentity httpentity = (httpentity) response.getentity (); if (response! = null) {return entityutils.tostring (httpentity, кодирование); }}} catch (ioException e) {e.printstacktrace (); } return null; }} Таким образом, мы инкапсулируем класс объектов, который запрашивает сертификат с HTTPS, а затем мы генерируем запрос интерфейса WeChat Red Envelope:
Подпись параметра https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack:
/*** Класс параметров красного конверта*@Throws UnsupportEncodingException*/ @ComponentPublic Class SendRedPack реализует serializable {/****/private static final longervionuid = -100048928099916099l; Private String nonce_str; // Случайная строка частная строка Wishing; // Red Overvelope Blessing Private String Client_IP; // IP -адрес private String ACT_NAME; // Имя деятельности Private String замечание; // Примечания 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 (строковый знак) {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 cettentotal_amount (int total_amount) {this.total_amount = total_amount; } public int getTotal_num () {return total_num; } public void cettentotal_num (int total_num) {this.total_num = total_num; } public String getWishing () {return Wishing; } public void setwishing (строка желает) {this.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 замечание; } public void setRemark (String замечание) {this.Remark = замечание; }}Далее находится контроллер, который отправляет красный пакет:
/*** Контроллер Red Overvelope* @author Zengliang*/ @Controller @requestMapping (value = "/redvelopesReceive") открытый класс REDENVERTESRECEIVECONTROLLER {// weChat уникальный идентификатор @Value ("$ {weexin.appid}") Private String Appid; // идентификатор пароля разработчика WeChat @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 opend, Long Redenvelopes_id, String mch_billno) {redenvelopes redenve = redvelodservice.fillindone (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 ()); // генерировать строки подписи params = this.createsendRedpackordersign (sendredpack, redenve.getstore_key ()); sendredpack.setsign (params); xmlutil.xstream (). Alias ("xml", sendredpack.getClass ()); // Extend xStream для поддержки строки блок CDATA requestXml = xmlutil.xstream (). Toxml (SendRedPack); Строка результата; try {result = httpclientssl.send ("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack", requestxml, httpclientssl.defaultsslclilefile ()); System.out.println («Успешное возвратное значение»+результат); результат возврата; } catch (unsupportEncodingexception 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 ("& re_billno ="). Append (redpack.getmch_billno ()); sign.append ("& armate ="). Append (redpack.getmch_id ()); sign.append ("& send_str ="). Append (redpack.getnonce_str ()); sign.append (redpack.getnonce_str ()); sign.append ("& re_openid ="). Append (redpack.getRe_openid ()); sign.append ("& armate ="). 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 ("& wosing ="). Append (redpack.getWishing ()); sign.append ("& wxappid ="). Append (redpack.getwxappid ()); sign.append ("& key ="). Append (StoreKey); return digestutils.md5Hex (sign.toString ()). Touppercase (); }}Затем нам нужно использовать класс инструментов для анализа XML для анализа XML, возвращаемого WeChat для анализа XML
/** * Парирование класса инструмента xml * @author zengliang */ @componentpublic class xmlutil {/** * parsing xml возвращается WeChat * @param xml * @return * @Throw = new HashMap <String, String> (); Документ doc = null; try {doc = documentHelper.parsetext (xml); // конвертировать строку в xml letle rootelt = doc.getrootelement (); // Получить список корневых узлов <element> list = rootelt.elements (); // Получить все узлы под корневым узлом для (элемент элемента: list) {// ranquility node map.put (element.getName (), element.getText ()); // Имя узла - это клавиша карты, а текст - значение карты}} catch (documentException e) {e.printstacktrace (); } catch (Exception e) {e.printstackTrace (); } return Map; } /** * Extend xstream to support CDATA block*/ private XStream xstream = new XStream(new XppDriver(new NoNameCoder()) { @Override public HierarchicalStreamWriter createWriter(Writer out) { return new PrettyPrintWriter(out) { // Add CDATA mark to all xml nodes for conversions boolean cdata = true; @Override @SuppressWarnings ("rawtypes") public void startNode (String name, Class Clazz) {Super.StartNode (имя, Clazz); writer.write (text); private xstream incualderlinexstream = new Xstream (новый Domdriver (null, new xmlfriendlynamecoder ("_-", "_")); public xstream getxstreaminclueunderline () {return inculaunderlinexstream; } public xstream xstream () {return xstream; } / *** Сгенерировать случайное число* @return* / public String random () {string random = uuid.randomuuid (). ToString (). Replace ("-", ""); вернуть случайное; }}Затем мы вызываем метод SendXML, чтобы отправить красные конверты пользователю.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.