Baru -baru ini, proyek ini membutuhkan pembayaran WeChat, dan kemudian saya melihat pembayaran akun resmi WeChat. Meskipun tidak sulit, detailnya masih perlu diperhatikan. Saya menghabiskan sebagian besar hari menulis demo dan menguji proses pembayaran sepenuhnya. Mari kita bagikan pengalaman pembayaran akun resmi WeChat di bawah ini.
1. Mengkonfigurasi akun weChat akun resmi
Kita perlu mengonfigurasi alamat pembayaran akun resmi WeChat dan menguji daftar putih.
Misalnya: Alamat halaman pembayaran JS adalah http://www.xxx.com/shop/pay/
Maka di sini dikonfigurasi www.xxx.com/shop/pay/
2. Proses Pengembangan
Pinjam akun resmi WeChat untuk membayar API (alamat http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=7_4), yang perlu kita kembangkan ditandai dengan warna merah. sebagai berikut:
3. Pesan dengan server WeChat
Hubungi antarmuka tunggal terpadu sehingga Anda bisa mendapatkan pembayaran prepay_id dari weChat (http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=9_1).
Sebelum memanggil antarmuka ini, ada beberapa bidang yang terbuka yang harus diisi untuk pembayaran H5.
3.1 Dapatkan OpenID
Anda dapat menggunakan formulir otorisasi web (http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html)
Kirim tautan berikut di WeChat
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=url&response_type=code&scope=snsapi_base&state=123#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#3#123#123#123#123#1
3.2 Tempatkan pesanan untuk mendapatkan prepay_id
Kode ini adalah sebagai berikut, yang sebenarnya mengirim file XML melalui posting untuk mendapatkan prepay_id yang dikirim dari server WeChat.
impor java.io.bytearrayInputStream; Impor JavaioioException; Impor JavaiiinputStream; Impor JavaiounsupportedencodingException; impor javautildate; impor javautilhashmap; impor javautiliterator; impor javautilmap; impor javautilmapentry; impor javautilrandom; impor javaxservlethttphttpservletrequest; impor JavaxSerVletHttphttpservletResponse; impor orgapachecommonscodecdigestdigestutils; impor orgspringframeworkstereotypeController; impor orgspringframeworkwebbindannotationRequestmapping; impor orgxmlpullvxmlpullparser; impor orgxmlpullvxmlpullparsexception; impor orgxmlpullvxmlPullParserFactory; Impor ComFasterXMLJackSondataBindJSonnode; Impor ComgsonoAuthoAuth; Impor ComgsonoAuthPay; impor comgsonutilhttpkit; Impor ComsyutildateTimeutil; impor comsyutiljsonutil; @Controller @RequestMapping ("/pay") kelas publik wxpaycontroller {@RequestMapping (value = "wxprepaydo") void jspay (httpservletRequest request, httpserVletResponse, "string callback) lemparan {// get OpenId OpenId OpenId = Sesi)," Permintaan ")," Get OpenID OpenID = SESION, "SESINGEDED)," Get OpenID OpenID = SESINGED "" Get OpenIDED = SESINGED ("Get OpenIDED (httpservletResponse," string callback) {// get OpenId (httpservletResponse (string callback) if (openId == null) {openId = getUseropenId (request); } String appId = "wx16691fcb0523c1a4"; String paternerKey = "iningfeng1234567fdfwfdfd1ss234567"; String out_trade_no = getTradeno (); Peta <string, string> paramap = new HashMap <string, string> (); paramapput ("appid", appid); Paramapput ("lampirkan", "tes"); ParamApput ("Body", "Test Buy Payment"); paramapput ("mch_id", "10283271"); paramapput ("nonce_str", create_nonce_str ()); Paramapput ("OpenId", OpenID); paramapput ("out_trade_no", out_trade_no); paramapput ("spbill_create_ip", getAddrip (permintaan)); paramapput ("total_fee", "1"); paramapput ("trade_type", "jsapi"); paramapput ("notify_url", "http: // wwwxxxco/bank/halaman/wxnotify"); String Sign = getSign (paramap, paternerKey); paramapput ("tanda", tanda); // pesanan terpadu https: // apimchweixinqqcom/pay/unified order string url = "https: // apimchweixinqcom/pay/unified order"; String xml = arraytoxml (paramap); String xmlstr = httpkitpost (url, xml); // ID Produk Prabayar String prepay_id = ""; if (xmlStrindexOf ("Success")! = -1) {Map <String, String> MAP = DOXMLPARSE (XMLSTR); prepay_id = (string) mapget ("prepay_id"); } Peta <string, string> paymap = new HashMap <string, string> (); paymapput ("appid", appid); paymapput ("timestamp", create_timestamp ()); paymapput ("noncestr", create_nonce_str ()); paymapput ("SignType", "MD5"); paymapput ("paket", "prepay_id =" + prepay_id); String paySign = getSign (paymap, paternerkey); paymapput ("pg", prepared_id); PayMapput ("PaySign", PaySign); WebUtilResponse (Respons, WebUtilPackJsonp (Callback, JsonutilwarpjSonnoderesponse (jsonutilobjecttoJsonnode (paymap)) tostring ())); } / ** * peta ke xml * * @param arr * @return * / public string arraytoxml (peta <string, string> arr) {string xml = "<xml>"; Iterator <entry <string, string >> iter = arrentryset () iterator (); while (iterhasnext ()) {entri <string, string> entri = iternext (); Tombol string = entrygetKey (); String val = entrygetValue (); xml + = "<" + key + ">" + val + "</" + key + ">"; } xml += "</xml>"; mengembalikan xml; } // Dapatkan string privat OpenId getUserOpeNID (permintaan httpservletRequest) melempar pengecualian {string code = requestParParameter ("code"); if (code == null) {string openId = requestGetParameter ("openId"); kembali OpenId; } OAuth o = oAuth baru (); String token = ogetToken (kode); JSonnode node = jsonutilstringtoJsonnode (token); String openId = nodeget ("openId") astext (); kembali OpenId; } Private String create_nonce_str () {string chars = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789"; String res = ""; untuk (int i = 0; i <16; i ++) {acak rd = acak baru (); res += charscharat (rdnextInt (charslength () - 1)); } return res; } private string getAddrip (permintaan httpservletRequest) {return requestReMoteAddr (); } private string create_timestamp () {return longToString (SystemCurrentTimeMillis () / 1000); } private string gettradeno () {string timestamp = DateTimeUtilFormatDate (new date (), DateTimeutildateTime_Pattern); mengembalikan "hzno" + timestamp; } private String getSign (peta <string, string> params, string paternerKey) melempar unsportedencodingException {string string1 = payCreateSign (params, false); String stringsignTemp = string1 + "& key =" + paternerKey; String SignValue = DigestUtilSmd5Hex (StringsignTemp) ToUppercase (); Return SignValue; } peta pribadi <string, string> doxmlparse (string xml) melempar xmlpullparsexception, ioException {inputStream inputStream = new ByTeArrayInputStream (xmlgetBytes ()); Peta <string, string> peta = null; Xmlpullparser pullparser = xmlpullparserFactoryNewInstance () newPullParser (); pullparsersetInput (inputStream, "UTF-8"); // Atur data XML yang akan diuraikan untuk XML int EventType = PullParserGetEventType (); while (eventType! = xmlpullparserend_document) {switch (eventType) {case xmlpullparsterstart_document: map = new HashMap <string, string> (); merusak; case xmlpullparsterstart_tag: tombol string = pullParsergetName (); if (KeyEquals ("xml")) break; String value = pullParSerNextText (); maput (kunci, nilai); merusak; case xmlpullparserend_tag: break; } eventType = pullParSerNext (); } return peta; }}4. Pembayaran H5
Pembayaran H5 sebenarnya sangat sederhana. Anda hanya perlu memanggil metode JS dari browser tertanam WeChat (http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=77_7)
<%@ page language = "java" contentType = "text/html; charset = utf-8" pageEncoding = "UTF-8"%> <%@ taglib prefix = "spring" uri = "http: // wwwspringframorkorg/tags"%> <%string path = requestcontpath (); String BasePath = RequestGetScheme () + ": //" + requestServerName () + ":" + requestServerPort () + path + "/"; %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 01 Transitional//EN" "http://wwworg/TR/html4/loosedtd"> <html> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=0, maximum-scale=0, user-scalable=0" /> <meta name="apple-mobile-web-app-capable" content="yes" /> <meta name="apple-mobile-web-app-status-bar-style" content="black" /> <meta name="apple-mobile-web-app-status-bar-style" content="black" /> <meta name="format-detection" content="telephone=no" /> <title>Test payment</title> <link href="/css/csss?v=0" rel="stylesheet" type="text/css"> </head> <body> <div> <div> WeChat js payment test</div> <div> <ul> <li><span>Test payment information</span></li> </ul> <p><a href="javascript:pay();">Pay now</a></p> </div> </div> <script type="text/javascript" src="/js/zeptominjs"></script> <script type="text/javascript" src="/js/commonjs"></script> <script type="text/javascript"> var appId = urlparameter ("appid"); var timestamp = urlparameter ("timestamp"); var noncestr = urlparameter ("noncestr"); var pg = urlparameter ("pg"); var SignType = urlparameter ("SignType"); var paySign = urlparameter ("paySign"); Fungsi onsbridgeready () {weixinjsbridgeInvoke ('getbrandwcpayRequest', {"appid": appid, // nama akun resmi, disahkan dalam "timestamp": timestamp, // timestamp, jumlah detik sejak 1970 "noncestr": noncestr, // paket acak "," pipar "," noncestr ": noncestr, // random pangkal", "noncestr": noncestr, // random pupping ":" noncestr ": noncestr, / /petak petak" // Metode Tanda Tangan WeChat: "PaySign": PaySign // WeChat Signature}, Function (res) {if (reserr_msg == "get_brand_wcpay_request: oke") {waspada (pay adalah keberhasilan "); menjamin bahwa itu benar -benar dapat diandalkan. } function pay () {if (typeOf weixinjsbridge == "undefined") {if (documentAddeventListener) {documentaddeventListener ('weixinjsbridgeready', onbridgeready, false); } else if (documentattachevent) {documentattachevent ('weixinjsbridgeready', onbridgeready); DocumentAttachEvent ('Onweixinjsbridgeready', Onbridgeready); }} else {onbridgeready (); }} </script> </body> </html> Efeknya adalah sebagai berikut
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.