ก่อนอื่นให้ดูที่ผลกระทบของซองจดหมายสีแดงเงินสดที่ออกโดยบัญชีอย่างเป็นทางการ:
จำเป็นต้องเรียกอินเทอร์เฟซของแพลตฟอร์มการค้า กฎการแจกแจงส่วนต่อประสานมีดังนี้:
1. ส่งขีดจำกัดความถี่ - ค่าเริ่มต้น 1800/นาที
2. ขีด จำกัด บนของจำนวนการส่ง - คำนวณตามค่าเริ่มต้น 1800/นาที
3. จำนวนขีด จำกัด บน - ขึ้นอยู่กับ ID ฉากที่เข้ามาขีด จำกัด บนเริ่มต้นสามารถตั้งค่าและนำไปใช้ในการตั้งค่าผลิตภัณฑ์แพลตฟอร์มพาณิชย์ได้สูงสุดไม่เกิน 4,999 หยวนต่อหน่วย
4. มีข้อ จำกัด อื่น ๆ เกี่ยวกับ "ปริมาณ" อะไรบ้าง? - จำนวนครั้งสูงสุดที่ผู้ใช้ได้รับในวันนั้นคือ 10 โดยค่าเริ่มต้น
5. หากปริมาณไม่สามารถตอบสนองความต้องการของเราได้เราจะเพิ่มขีด จำกัด สูงสุดได้อย่างไร -จำนวนเงินสูงสุดและจำนวนครั้งสูงสุดที่ผู้ใช้ได้รับในวันเดียวกันสามารถตั้งค่าได้บนแพลตฟอร์มการค้า
หมายเหตุ- เมื่อจำนวนซองจดหมายสีแดงมากกว่า 200 ต้องส่งผ่านพารามิเตอร์การร้องขอ scene_id และคำอธิบายพารามิเตอร์จะแสดงด้านล่าง
หมายเหตุ 2 - ตามข้อกำหนดด้านกฎระเบียบจะต้องปฏิบัติตามเงื่อนไขสองข้อเมื่อสมัครซองจดหมายสีแดงเงินสดสำหรับบัญชีผู้ค้าที่ใช้ใหม่: 1. เวลาเข้าเกิน 90 วัน 2 การทำธุรกรรมปกติอย่างต่อเนื่องเป็นเวลา 30 วัน
ขอ URL https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack
ไม่ว่าจะจำเป็นต้องมีใบรับรองหรือไม่ (ดูใบรับรองผู้ค้าสำหรับรายละเอียด)
ขอโพสต์วิธีการ
ขอตัวอย่างข้อมูล:
<xml> <mign> <! [CDATA [E1EE61A91C8E90F299DE6AE075D60A2D]]> </ign> <MCH_BILLNO> <! [CDATA [00100104042014111700000 000046545]]> </mch_billno> <mch_id> <! [cdata [888]]> </mch_id> <wxappid> <! [cdata [wxcbda96de0b165486] pid> <end_name> <! [cdata [send_name]]> </send_name> <re_openid> <! [cdata [onqojjmm1tad-3ropncn-yufa6ui] e_openid> <total_amount> <! [cdata [200]]> </thotal_amount> <total_num> <! [cdata [1]]> </total_num> <wishing> <! [CD ata [ขอแสดงความยินดีกับการรวย]]> </ishing> <client_ip> <! [cdata [127.0.0.1]]> </client_ip> <act_name> <! [CDATA [ซองจดหมายสีแดงปีใหม่] ซองจดหมาย]]> </คำพูด> <sence_id> <! [cdata [product_2]]> </scene_id> <consume_mch_id> <! [cdata [10 000097]]> </consume_mch_id> <nonce_str> <! [cdata [50780e0cca98c8c8e814883e5caa672e]]> </nonce_str> <ความเสี่ยง o> posttime%3D123123412%26Clientversion%3D234134%26mobile%3D122344545%26DeviceID%3DIOS </ความเสี่ยง ณ
อินเทอร์เฟซต้องการการโทรไปยังใบรับรองของแพลตฟอร์มผู้ค้าและต้องดาวน์โหลดใบรับรองจากแพลตฟอร์มการค้า:
จากนั้นใช้ใบรับรองในอินเทอร์เฟซ ก่อนอื่นเราสร้างคลาส Weixinssl ใหม่
@componentpublic คลาส Weixinssl { / *** ประเภทใบรับรอง* / @Value ("$ {werchant.storekey}") String StoreKey ส่วนตัว; / *** เส้นทางไฟล์*/ @Value ("$ {werchant.sslfile}") สตริงส่วนตัว sslfile; / *** หมายเลขผู้ค้า*/ @Value ("$ {werchant.merchantNumber}") สตริงส่วนตัว MerchantNumber; สตริงสาธารณะ getStoreKey () {return storeKey; } โมฆะสาธารณะ setStoreKey (String StoreKey) {this.storekey = storeKey; } สตริงสาธารณะ getSlfile () {return sslfile; } โมฆะสาธารณะ setsslfile (สตริง sslfile) {this.sslfile = sslfile; } สตริงสาธารณะ getMerchantNumber () {return merchantNumber; } โมฆะสาธารณะ setMerchantNumber (String MerchantNumber) {this.merchantNumber = MerchantNumber; -ห่อหุ้มคลาส HTTPClientsSL เพื่อใช้คำขอ HTTPS เพื่อเพิ่มใบรับรอง:
@componentpublic คลาส httpclientsl {@autowired ส่วนตัว weixinssl weixinssl; // ขอหมดเวลา (มิลลิวินาที) 5 วินาที public requestconfig requestconfig; // การตอบสนองการหมดเวลา (มิลลิวินาที) 60 วินาทีสาธารณะคงที่ int http_response_timeout = 60 * 1000; // httpClient อักขระการเข้ารหัสสตริงสแตติกสาธารณะ = "UTF-8"; Public Static RequestConfig getRequestConfig () {return requestconfig.custom (). setConnectTimeout (5 * 1000) .SetConnectionRequestTimeOut (http_response_timeout) .build (); } โมฆะคงที่สาธารณะ setRequestConfig (RequestConfig requestConfig) {httpClientssl.requestConfig = requestconfig; } / *** HTTPS Regest Pergery ใบรับรอง* @return* / Public CloseablehttpClient defaultsSlClient () {sslContext sslContext = null; ลอง {ใหม่ sslcontextbuilder (). loadtrustmaterial (null, new Truststrategy () {@Override บูลีนสาธารณะ istrusted (x509certificate [] chain, string authtype) โยน java.security.cert.certificateException } catch (nosuchalgorithmexception | keystoreexception e) {e.printstacktrace (); } SSLConnectionsOcketFactory โรงงาน = ใหม่ SSLConnectionsOcketFactory (SSLContext); ส่งคืน httpclients.custom (). setsslsocketfactory (โรงงาน) .build (); } / *** คำขอ https เพื่อเพิ่มใบรับรอง* @return* / public closeablehttpclient defaultsslClientfile () {ถ้า (this.weixinssl == null) {ส่งคืนสิ่งนี้ defaultsslClient (); } fileInputStream inputStream = null; KeyStore KeyStore = NULL; ลอง {// ssl type 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 (); } ในที่สุด {ลอง {inputStream.close (); } catch (ioexception e) {e.printstacktrace (); }} sslContext sslContext = null; ลอง {sslContext = sslContexts.custom (). loadKeYmaterial (KeyStore, Weixinssl.getMerchantNumber (). tochararray ()). build (); } catch (unrecoverablekeyException | nosuchalgorithmexception | keystoreexception | keymanagementexception e) {e.printstacktrace (); } SSLConnectionsOcketFactory โรงงาน = ใหม่ sslConnectionsOcketFactory (sslContext, สตริงใหม่ [] {"tlsv1"}, null, sslconnectionsocketFactory.browser_compatible_hostname_verifier); ส่งคืน httpclients.custom (). setsslsocketfactory (โรงงาน) .build (); } / *** วิธีการห่อหุ้มเพื่อส่งคำขอ* @throws unsupportencodingException* / สตริงสาธารณะส่ง (url สตริง, สตริงข้อมูล, closeablehttpClient closeablehttpClient) โยน unsupportencodexception httppost httppost = new httppost (urldecoder.decode (URL, การเข้ารหัส)); httppost.addheader ("การเชื่อมต่อ", "Keep-Alive"); httppost.addheader ("ยอมรับ", "*/*"); httppost.addheader ("เนื้อหาประเภท", "แอปพลิเคชัน/x-www-form-urlencoded; charset = utf-8"); httppost.addheader ("โฮสต์", "api.mch.weixin.qq.com"); httppost.addheader ("x-requested-with", "xmlhttprequest"); httppost.addheader ("cache-control", "max-age = 0"); httppost.addheader ("ผู้ใช้ตัวแทน", "mozilla/4.0 (เข้ากันได้; MSIE 8.0; Windows NT 6.0)"); httppost.setConfig (this.getRequestConfig ()); // ตั้งค่าหมดเวลาปิดการตอบสนองการตอบสนองต่อการตอบสนอง = null; // ใส่พารามิเตอร์ใน strentEntity entity = new StressEntity (ข้อมูล, การเข้ารหัส); entity.setContentEncoding (การเข้ารหัส); Entity.SetContentType ("Application/XML"); httppost.setEntity (เอนทิตี); ลอง {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 จากนั้นเราสร้างอินเตอร์เฟสซองจดหมายสีแดง WeChat Red ที่ร้องขอ:
ลายเซ็นพารามิเตอร์ของ https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack:
/*** คลาสพารามิเตอร์ซองจดหมายสีแดง*@throws unsupportencodingException*/ @componentPublic คลาส SendredPack ใช้ serializable {/****/ส่วนตัวคงที่สุดท้าย Long SerialVersionUid = -1000489228099916099L; สตริงส่วนตัว nonce_str; // การสุ่มสตริงสตริงส่วนตัวสัญญาณ; // ลายเซ็นสตริงส่วนตัว mch_billno; // หมายเลขคำสั่งซื้อของผู้ค้าสตริงส่วนตัว mch_id; // หมายเลขผู้ค้าสตริงส่วนตัว wxappid; // บัญชีสาธารณะสตริงส่วนตัว send_name; // ชื่อผู้ค้ารวม re_openid; // ผู้ใช้ ซองจดหมายสีแดงอวยพรสตริงส่วนตัว client_ip; // ที่อยู่ IP สตริงส่วนตัว act_name; // ชื่อกิจกรรมสตริงส่วนตัวหมายเหตุ; // หมายเหตุสตริงสาธารณะ getNonce_str () {return nonce_str; } โมฆะสาธารณะ setNonce_str (สตริง nonce_str) {this.nonce_str = nonce_str; } Public String getSign () {return sign; } โมฆะสาธารณะ setSign (เครื่องหมายสตริง) {this.sign = sign; } สตริงสาธารณะ getMch_Billno () {return mch_billno; } โมฆะสาธารณะ setmch_billno (String mch_billno) {this.mch_billno = mch_billno; } สตริงสาธารณะ getMch_id () {return mch_id; } โมฆะสาธารณะ setmch_id (String mch_id) {this.mch_id = mch_id; } สตริงสาธารณะ getWxAppId () {return wxAppId; } โมฆะสาธารณะ setWxAppId (สตริง wxAppId) {this.wxappid = wxappid; } สตริงสาธารณะ getSend_name () {return send_name; } โมฆะสาธารณะ setSend_name (สตริง send_name) {this.send_name = send_name; } สตริงสาธารณะ getre_openid () {return re_openid; } โมฆะสาธารณะ setre_openid (string re_openid) {this.re_openid = re_openid; } สาธารณะ int getTotal_amount () {return total_amount; } โมฆะสาธารณะ settotal_amount (int total_amount) {this.total_amount = total_amount; } สาธารณะ int getTotal_num () {return total_num; } โมฆะสาธารณะ settotal_num (int total_num) {this.total_num = total_num; } สตริงสาธารณะ getWishing () {return wishing; } โมฆะสาธารณะ setwishing (ความปรารถนาสตริง) {this.wishing = wishing; } สตริงสาธารณะ getClient_ip () {return client_ip; } โมฆะสาธารณะ setClient_ip (String client_ip) {this.client_ip = client_ip; } สตริงสาธารณะ getact_name () {return act_name; } โมฆะสาธารณะ setAct_name (สตริง act_name) {this.act_name = act_name; } สตริงสาธารณะ getRemark () {return หมายเหตุ; } โมฆะสาธารณะ setRemark (หมายเหตุสตริง) {this.Remark = หมายเหตุ; -ถัดไปคือคอนโทรลเลอร์ที่ส่งแพ็คเก็ตสีแดง:
/*** ตัวควบคุมซองจดหมายสีแดง* @author zengliang*/ @controller @requestmapping (value = "/redenvelopesreceive") คลาสสาธารณะ redenvelopesreceiveController {// weChat ตัวระบุ @value ("$ {weixin.appid}" // WeChat Developer Password Identifier @Value ("$ {weixin.appSecret}") แอปสตริงสาธารณะ @autowired ส่วนตัว Sendredpack Sendredpack; @autowired ส่วนตัว httpclientsl httpclientsl; /*** ส่งพารามิเตอร์ XML* @author Zengliang*/@ResponseBody @requestmapping (value = "/sendxml") สตริงสาธารณะ sendxml (สตริง openId, redenvelopes_id, string mch_billno) {redenvelopes redenve = redenvelopesservice xmlutil xmlutil = ใหม่ 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 ()); สตริง 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 ()); // สร้างพารามิเตอร์สตริงลายเซ็น = this.createDredRedPackordersign (SendredPack, redenve.getStore_key ()); sendredpack.setsign (params); xmlutil.xstream (). นามแฝง ("xml", sendredpack.getClass ()); // ขยาย xstream เพื่อรองรับสตริงบล็อก cdata requestxml = xmlutil.xstream (). toxml (sendredpack); สตริงผลลัพธ์; ลอง {result = httpclientssl.send ("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack", requestxml, httpclientssl.defaultslclientfile ()); System.out.println ("ผลตอบแทนที่สำเร็จ"+ผลลัพธ์); ผลการกลับมา; } catch (unsupportencodingexception e) {e.printstacktrace (); } return null; }/ ** * สร้างลายเซ็น * @param redpack * @return */ สตริงสาธารณะ createSendredPackOrdersign (SendredPack Redpack, String StoreKey) {StringBuffer Sign = New StringBuffer (); sign.append ("act_name =") ผนวก (redpack.getact_name ()); sign.append ("& client_ip =") ผนวก (redpack.getClient_ip ()); sign.append ("& re_billno =") ผนวก (redpack.getmch_billno ()); sign.append ("& stoungal ="). ผนวก (redpack.getmch_id ()); sign.append ("& send_str =") ผนวก (redpack.getNonce_str ()); sign.append (redpack.getNonce_str ()); sign.append ("& re_openid =") ผนวก (redpack.getre_openid ()); sign.append ("& quayd ="). ต่อ (redpack.getRemark ()); sign.append ("& send_name =") ผนวก (redpack.getsend_name ()); sign.append ("& total_amount =") ผนวก (redpack.getTotal_amount ()); sign.append ("& total_num =") ผนวก (redpack.getTotal_num ()); sign.append ("& wishing ="). ผนวก (redpack.getWishing ()); sign.append ("& wxappid =") ผนวก (redpack.getwxappid ()); sign.append ("& key =") ผนวก (storeKey); return digestutils.md5hex (sign.toString ()). touppercase (); -จากนั้นเราจำเป็นต้องใช้คลาสเครื่องมือเพื่อแยกวิเคราะห์ XML เพื่อแยกวิเคราะห์ XML ที่ส่งคืนโดย WeChat เพื่อแยกวิเคราะห์ XML
/** * การแยกวิเคราะห์คลาสเครื่องมือ XML * @author Zengliang */ @ComponentPublic คลาส XMLUTIL {/** * การแยกวิเคราะห์ XML กลับมาโดย weChat * @param xml * @return * @throws Exception */@SuppressWarnings ( map = new hashmap <string, string> (); เอกสารเอกสาร = null; ลอง {doc = documenthelper.parsetext (xml); // แปลงสตริงเป็นองค์ประกอบ xml rootelt = doc.getRootelement (); // รับรายการโหนดรูท <องค์ประกอบ> list = rootelt.Elements (); // รับโหนดทั้งหมดภายใต้โหนดรูทสำหรับ (องค์ประกอบองค์ประกอบ: รายการ) {// ความเงียบสงบโหนด map.put (element.getName (), element.getText ()); // ชื่อของโหนดคือคีย์แผนที่และข้อความคือค่าแผนที่}} catch (documentException e) {e.printStackTrace (); } catch (exception e) {e.printstacktrace (); } กลับแผนที่; } / *** ขยาย xstream เพื่อรองรับบล็อก cdata* / ส่วนตัว xstream xstream = ใหม่ xstream (ใหม่ xppdriver (nonamecoder ใหม่ ()) {@Override public hierarchicalStreamWriter CreateWriter @suppresswarnings ("rawtypes") โมฆะสาธารณะ startNode (ชื่อสตริง, คลาส Class) {super.startnode (ชื่อ, clazz);} @Override String encodenode (ชื่อสตริง) Writer.write (ข้อความ); ส่วนตัว xstream influeunderlinexstream = ใหม่ xstream (ใหม่ domdriver (null, xmlifriendlynamecoder ใหม่ ("_-", "_"))); สาธารณะ xstream getxstreaminclueunderline () {return solueunderlinexstream; } สาธารณะ xstream xstream () {return xstream; } / *** สร้างหมายเลขสุ่ม* @return* / สตริงสาธารณะสุ่ม () {สตริงสุ่ม = uuid.randomuuid (). toString (). แทนที่ ("-", ""); กลับสุ่ม; -จากนั้นเราเรียกเมธอด SendXML เพื่อส่งซองจดหมายสีแดงไปยังผู้ใช้
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น