Pertama -tama mari kita lihat efek amplop tunai merah yang dikeluarkan oleh akun resmi:
Penting untuk memanggil antarmuka platform pedagang, dan aturan distribusi antarmuka adalah sebagai berikut:
1. Kirim Batas Frekuensi - Default 1800/Min
2. Batas atas jumlah pengiriman - dihitung sesuai dengan default 1800/mnt
3. Jumlah Batas Atas - Tergantung pada ID Adegan yang Masuk, batas atas default dapat diatur dan diterapkan untuk pengaturan produk Platform Pedagang, dengan maksimum tidak lebih dari 4.999 yuan per unit
4. Apa batasan lain pada "kuantitas" yang ada? - Jumlah maksimum kali yang diterima pengguna pada hari itu adalah 10 secara default
5. Jika jumlahnya tidak dapat memenuhi kebutuhan kita, bagaimana kita dapat meningkatkan setiap batas atas? -Batas jumlah maksimum dan jumlah maksimum kali yang diterima pengguna pada hari yang sama dapat ditetapkan pada platform pedagang
Catatan- Ketika jumlah amplop merah lebih besar dari 200, parameter permintaan adegan_id harus dilewati, dan deskripsi parameter ditunjukkan di bawah ini.
Catatan 2 - Menurut persyaratan peraturan, dua kondisi diharuskan menggunakan amplop merah tunai untuk akun pedagang yang baru diterapkan: 1. Waktu masuk melebihi 90 hari 2. Transaksi normal kontinu selama 30 hari.
Minta url https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack
Apakah sertifikat diperlukan (lihat sertifikat pedagang untuk detailnya)
Posting Metode Permintaan
Contoh Data Permintaan:
<xml> <Inding> <! [Cdata [E1EE61A91C8E90F299DE6AE075D60A2D]]> </Sign> <cch_billno> <! [CDATA [0010010404201411170 000046545]]> </cch_billno> <cch_id> <! [Cdata [888]]> </cch_id> <wxappid> <! [Cdata [wxcbda96de0b165486]]> </wxap pid> <send_name> <! [cdata [send_name]]> </send_name> <e_openid> <! [CDATA [onqojjmm1tad-3ropncn-yufa6ui]]> </r e_openid> <t total_amount> <! [Cdata [200]]> </t total_amount> <t total_num> <! [Cdata [1]]> </t total_num> <wointing> <! [Cd ATA [ucapan selamat tentang menjadi kaya]]> </wishing> <client_ip> <! [Cdata [127.0.0.1]]> </client_ip> <crain_name> <! [Cdata [Cdata New Year Red]]> </act_name> <comentar> <! Amplop]]> </komentar> <scene_id> <! [Cdata [product_2]]> </stance_id> <consume_mch_id> <! [Cdata [10 000097]]> </consume_mch_id> <nonce_str> <! [CDATA [50780E0CCA98C8C8E814883E5CAA672E]]> </sce_str> <Risiko_inf o> pasca -waktu%3d123123412%26clientVersion%3d234134%26mobile%3d122344545%26deviceid%3diOS </sisk_info> </xml>
Antarmuka membutuhkan panggilan ke sertifikat platform pedagang, dan sertifikat perlu diunduh dari platform pedagang:
Kemudian gunakan sertifikat di antarmuka. Pertama, kami membuat kelas Weixinssl baru
@ComponentPublic kelas weixinssl { / *** Tipe sertifikat* / @Value ("$ {werchant.storey}") store string pribadi; / *** path file*/ @value ("$ {werchant.sslfile}") Private String sslfile; / *** nomor pedagang*/ @value ("$ {werchant.merchantnumber}") private string merchantNumber; Public String getStorey () {return storeKey; } public void setStorey (string storeKey) {this.storey = storeKey; } public String getSlfile () {return sslfile; } public void setsslfile (string sslfile) {this.sslfile = sslfile; } public string getMerchantNumber () {return rantNumber; } public void setMerchantNumber (String MerchantNumber) {this.merchantNumber = MerchantNumber; }}Encapsulate kelas httpclientssl untuk mengimplementasikan permintaan https untuk menambahkan sertifikat:
@ComponentPublic Class httpclientssl {@Autowired private weixinssl weixinssl; // Minta batas waktu (milidetik) 5 detik permintaan public staticconfig permintaanconfig; // Batas waktu respons (milidetik) 60 detik int statis publik http_response_timeout = 60 * 1000; // HTTPClient karakter mengkode 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; } / *** sertifikat pemalsuan permintaan https* @return* / public closeableHttpClient defaultsslclient () {sslcontext sslcontext = null; Coba {SSLContextBuilder baru (). LoadTrustMaTerial (null, trustStrategy baru () {@Override public boolean istrusted (x509certificate [] rantai, string authType) melempar java.security.cert.certificateException {return false;}; } catch (nosuchalgorithMexception | keyStoreException e) {e.printstacktrace (); } SSLConnectionCocketFactory factory = SSLConnectionCockEtFactory baru (SSLContext); return httpclients.custom (). setsslsocketfactory (factory) .build (); } / *** Permintaan https untuk menambahkan sertifikat* @return* / public closeableHttpClient defaultsslClientFile () {if (this.weixinssl == null) {return this.defaultslClient (); } FileInputStream inputStream = null; Keystore keystore = null; coba {// ssl type keystore = keystore.getInstance (weixinssl.getStorEkey ()); // ssl file inputStream = new fileInputStream (weixinssl.getsslfile ()); // atur keystore kata sandi SSL.Load (inputStream, weixinssl.getMerchantNumber (). TocharArray ()); } Catch (KeyStoreEexception | NosuchalGorithMException | CertificateException | IoException E1) {E1.PrintStackTrace (); } akhirnya {coba {inputStream.close (); } catch (ioException e) {e.printstacktrace (); }} Sslcontext sslcontext = null; coba {sslcontext = sslcontexts.custom (). LoadKeyMaterial (keystore, weixinssl.getMerchantNumber (). tochararray ()). build (); } Catch (UnreCableKeyException | nosuchalgorithMexception | KeyStoreEexception | KeyManagementException e) {e.printstacktrace (); } SSLConnectionCocketFactory factory = SSLConnectionCockEtFactory baru (sslcontext, string baru [] {"tlsv1"}, null, sslconnectionCocketfactory.browser_compatible_hostname_verifier); return httpclients.custom (). setsslsocketfactory (factory) .build (); } / *** Mengenak metode untuk mengirim permintaan* @throws unsportedencodingException* / public string kirim (string url, data string, closeableHttpclient closeableHttpclient) melempar unsupportedencodingException {closeableHttpClient client = closeableHttpClientPclient; Httppost httppost = baru httppost (urldecoder.decode (url, encoding)); httppost.addheader ("koneksi", "Keep-Alive"); httppost.addheader ("terima", "*/*"); httppost.addheader ("tipe konten", "Aplikasi/X-WWW-Form-Urlencoded; charset = UTF-8"); httppost.addheader ("host", "api.mch.weixin.qq.com"); httppost.addheader ("X-Relquested-with", "xmlhttpRequest"); httppost.addheader ("cache-control", "max-seage = 0"); httppost.addheader ("agen pengguna", "mozilla/4.0 (kompatibel; msie 8.0; windows nt 6.0)"); httppost.setConfig (this.getRequestConfig ()); // Set timeout closeableHttpresponse response = null; // Masukkan parameter di entitas stringEntity = stringEntity baru (data, encoding); entity.setContentencoding (encoding); entity.setContentType ("Application/XML"); httppost.setentity (entitas); coba {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; }} Dengan cara ini, kami merangkum kelas entitas yang meminta sertifikat dengan https, dan kemudian kami menghasilkan antarmuka amplop merah WeChat yang diminta:
Tanda Tangan Parameter https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack:
/*** Kelas Entitas Parameter Red Amplop*@Throws UnsupportedEncodingException*/ @ComponentPublic Class SendRedPack mengimplementasikan serializable {/****/private static final long serialVersionUID = -100048922809916099l; Private String nonce_str; // String acak string private string tanda; // tanda tangan pribadi string mch_billno; // nomor pesanan pedagang string pribadi mch_id; // nomor pedagang string pribadi wxappid; // akun publik string pribadi send_name; // name pedagang pribadi string re_openid; // pengguna total inter_amount; // jumlah pembayaran private: Red Envelope Blessing Private String Client_IP; // IP Alamat Private String Act_name; // Nama Aktivitas Private String Komentar; // Catatan Publik 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 = tanda; } 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; } string publik getend_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 rome; } public void setRemark (string commise) {this.remark = koment; }}Berikutnya adalah pengontrol yang mengirimkan paket merah:
/*** Pengendali Amplop Merah* @author zengliang*/ @controller @requestmapping (value = "/redenvelopesReceive") kelas publik redenvelopesReceivecontroller {// weChat identifier unik @value ("$ {weixin.appid}) weChat private @value (" $ {weixin.appid}) private string; // weChat pengembang pengidentifikasi kata sandi @value ("$ {weixin.appsecret}") public string appSecret; @Autowired private sendredpack sendredpack; @Autowired private httpclientssl httpclientssl; /*** Kirim parameter xml* @author zengliang*/@responseBody @RequestMapping (value = "/sendxml") Public String Sendxml (String OpenID, Redenvelopes_ID Long, string mch_billno) {redenvelopes redenvelopes = redenvelopess.billno) {redenvelopes redenve = redenvelopess.billno) {redenvelopes Xmlutil xmlutil = xmlutil baru (); 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: "kosong"); 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 ()); // Hasilkan string tanda tangan params = this.createSendRedPackorderSign (sendredpack, redenve.getstore_key ()); sendredpack.setsign (params); xmlutil.xstream (). alias ("xml", sendredpack.getclass ()); // Perpanjang xStream untuk mendukung cdata blok string requestXml = xmlutil.xstream (). Toxml (sendredpack); Hasil string; coba {result = httpclientssl.send ("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack", requestXml, httpclientssl.defaultsslclientfile ()); System.out.println ("nilai pengembalian yang berhasil"+hasil); hasil pengembalian; } catch (UnsupportedEncodingException e) {e.printstacktrace (); } return null; }/ ** * Hasilkan tanda tangan * @param redpack * @return */ public String createSEndPackOrderSign (sendredpack redpack, string storeKey) {stringBuffer Sign = new StringBuffer (); tanda.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 ("& commom ="). append (redpack.getmch_id ()); tanda.append ("& send_str ="). append (redpack.getnonce_str ()); Sign.Append (redpack.getnonce_str ()); tanda.append ("& re_openid ="). append (redpack.getre_openid ()); Sign.append ("& commom ="). append (redpack.getRemark ()); tanda.append ("& send_name ="). append (redpack.getsend_name ()); tanda.append ("& total_amount ="). append (redpack.gettotal_amount ()); tanda.append ("& total_num ="). append (redpack.gettotal_num ()); Sign.Append ("& Wishing ="). Append (redpack.getWishing ()); tanda.append ("& wxappid ="). append (redpack.getwxappid ()); Sign.Append ("& key ="). Append (Storey); kembalikan digestutils.md5hex (Sign.tostring ()). Toupercase (); }}Maka kita perlu menggunakan kelas alat untuk parse xml untuk parse xml dikembalikan oleh weChat untuk parse xml
/** * Parsing XML tool class * @author zengliang */@Componentpublic class XMLUtil { /** * Parsing XML returned by WeChat * @param xml * @return * @throws Exception */ @SuppressWarnings("unchecked") public Map<String, String> parseXml(String xml)throws Exception { Map<String,String> peta = hashmap baru <string, string> (); Dokumen dokumen = null; coba {doc = documenthelper.parsetext (xml); // Konversi string ke elemen xml rootelt = doc.getrooteLement (); // Dapatkan daftar node root <sement> list = rootelt.elements (); // Dapatkan semua node di bawah node root untuk (elemen elemen: daftar) {// tranquility node map.put (element.getName (), element.getText ()); // Nama node adalah kunci peta, dan teksnya adalah nilai peta}} catch (DocumentException e) {E.PrintStackTrace (); } catch (Exception e) {E.PrintStackTrace (); } return peta; } / *** Perpanjang xStream untuk mendukung blok cdata* / private xstream xstream = new xstream (xppdriver baru (nonamecoder baru ()) {@Override public hierarchicalStreamWriter createWriter (writer out) {return prettyPrintwriter baru (out) { / tambahkan cdata mark ke semua xm nodion = conving convony = cdata cdata; @SuppressWarnings ("RawTypes") public void startNode (nama string, class clazz) {super.startnode (name, clazz) @Override public string encodenode (name string) {cdat) {"cdat) {cdat) {cdat) {cdat) {cdat) {cdat) {cdat) {cdat) {cdat) {cdat) {cdat) penulis. Teks); private xstream incleueunderLinexStream = new XStream (domdriver baru (null, xmlfriendlynamecoder baru ("_-", "_"))); publik xStream getxStreamInclueDerline () {return incleueunderlinexStream; } public xstream xStream () {return xstream; } / *** Hasilkan nomor acak* @return* / public string random () {string random = uuid.randomuuid (). ToString (). Ganti ("-", ""); kembali secara acak; }}Kemudian kami memanggil metode SendXML untuk mengirim amplop merah ke pengguna.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.