Vor kurzem erfordert das Projekt eine WeChat -Zahlung, und dann habe ich mir die offizielle Kontozahlung von WeChat angesehen. Obwohl es nicht schwierig ist, müssen die Details immer noch beachtet werden. Ich habe den größten Teil des Tages damit verbracht, eine Demo zu schreiben, und den Zahlungsverfahren vollständig getestet. Teilen wir die Erfahrung der offiziellen Kontoauszahlung von WeChat nachstehend mitteilen.
1. Konfigurieren Sie das offizielle Konto WeChat Zahlung
Wir müssen die WeChat Official Account -Zahlungsadresse konfigurieren und die Whitelist testen.
Zum Beispiel: Die Adresse der Zahlung JS ist http://www.xxx.com/shop/pay/
Dann ist hier konfiguriert www.xxx.com/shop/pay/
2. Entwicklungsprozess
Leihen Sie das WeChat -offizielle Konto aus, um die API zu bezahlen (Adresse http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=7_4), das wir entwickeln müssen, ist rot markiert. wie folgt:
3. Geben Sie eine Bestellung mit dem WeChat -Server auf
Rufen Sie die einheitliche einzelne Schnittstelle an, damit Sie die Prepay_id der Wechat -Zahlung erhalten können (http://pay.weixin.qqq.com/wiki/doc/api/index.php?chapter=9_1).
Bevor Sie diese Schnittstelle nennen, gibt es mehrere Felder, die OpenIDs sind, die für die H5 -Zahlung ausgefüllt werden müssen.
3.1 OpenID
Sie können das Web -Autorisierungsformular verwenden (http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html)
Senden Sie den folgenden Link in WeChat
https://open.weixin.qqq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=url&response_type=Code&scope=snsapi_base&state=123#wechat_Rect_Rect_Rect_Rect_Rect_Rect_Rect_Rect_Rect_Rect_Rect_Rect
3.2 Bestellen Sie eine Bestellung, um Prepay_ID zu erhalten
Der Code ist wie folgt, wodurch tatsächlich eine XML -Datei über Post gesendet wird, um die vom WeChat -Server gesendeten Prepay_ID zu erhalten.
importieren java.io.BytearrayInputStream; JavaioioException importieren; Javaioinputstream importieren; JavaiounsupportedenCodingException importieren; Javautate importieren; JavautilhashMap importieren; Javautiliterator importieren; Javautilmap importieren; Javautilmapentry importieren; Javautilrandom importieren; JavaxServlethttPttpServletRequest importieren; JavaxServlethttpttpServletResponse importieren; import orgapachecommonscodecDigestDigestutils; import orgspringframeWorkstereotypeController; import orgspringframeworkwebbindAnnotationRequestmapping; import orgxmlpullVxmlpullParser; import orgxmlpullvxmlpullParSerexception; import orgxmlpullVxmlpullParSerFactory; comfasterxmljackSondatabindjsonNode importieren; Import ComgsonoAuthoauth; ComgsonoAuthpay importieren; import Comgsonutilhttpkit; comsyutildaTimeutil importieren; comsyutiljsonutil importieren; @Controller @RequestMapping ("/pay") öffentliche Klasse WxPayController {@RequestMapping (value = "wxprepaydo") public void jspay (httpServletRequest, HttpServletResponse -Antwort, String Callback) löscht Ausnahme von {////// // OpenID openID = OpenID = OpenID = OpenID = OpenID = OpenID = SessionuStaud). if (openID == null) {openID = getUseropenid (Anfrage); } String appid = "WX16691FCB0523C1A4"; String paternerkey = "Iningfeng1234567fdfwfdfd1SS234567"; String out_trade_no = getTradeno (); Karte <string, string> paramap = new HashMap <String, String> (); paramApput ("Appid", Appid); paramApput ("anhängen", "test"); ParamApput ("Körper", "Testkaufzahlung"); 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 (request)); paramApput ("Total_fee", "1"); paramApput ("Trade_type", "jsapi"); paramApput ("benachrichtigen_url", "http: // wwwxxxco/bank/page/wxnotify"); String Sign = GetSign (Paramap, PaternerKey); paramApput ("Zeichen", Zeichen); // Unified Order https: // apimchweixinqqcom/pay/unifiedorder String url = "https: // apimchweixinqqqcom/pay/unifiedorder"; String xml = arrayToxml (paramap); String xmlstr = httpkitPost (URL, xml); // Prepaid Product ID String Prepay_id = ""; if (xmlStrindexof ("Erfolg")! prepay_id = (string) mapget ("prepay_id"); } Map <string, string> paymap = new HashMap <String, String> (); payMapput ("Appid", Appid); payMapput ("timestamp", create_timestamp ()); payMapput ("noncest", create_nonce_str ()); PayMapput ("SignType", "Md5"); payMapput ("Paket", "prepay_id =" + prepay_id); String paySign = GETSIGN (PayMap, Paternerkey); payMapput ("pg", prepe_id); paymapput ("paysign", paysign); WebutilResponse (Antwort, WebutilpackjsonP (Callback, JsonUtilwarpjsonNoderePonse (jsonUtilObjecttojsonNode (PayMap)) toString ())); } / ** * map to xml * * @param arr * @return * / public String arrayToxml (map <String, String> arr) {String xml = "<xml>"; Iterator <Eintrag <String, String >> iter = ArrentRySet () iterator (); while (iterHasNext ()) {Eintrag <String, String> Eintrag = iTernext (); String key = EntryGetKey (); String val = EntryGetValue (); xml + = "<" + taste + ">" + val + "</" + taste + ">"; } xml += "</xml>"; Return XML; } // OpenID private String GetUSerOpenID (httpServletRequest -Anforderung) ausreihen {string code = requestgetParameter ("Code"); if (code == null) {string openID = requestGetParameter ("openID"); return openID; } OAuth o = new oAuth (); String token = ogettoken (Code); JSONNODE NODE = JSONUTILSTRINGTOJSONNODE (Token); String openID = nodeGet ("openID") asText (); return openID; } private String create_nonce_str () {string chars = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789"; String res = ""; für (int i = 0; i <16; i ++) {random rd = new random (); res += charsCharat (rdnextint (charsLength () - 1)); } return res; } private String getAdDrip (httpServletRequest -Anforderung) {return requestGetRemoteaddr (); } private String create_timestamp () {return longoString (SystemCurrentTimemillis () / 1000); } private String getTradeno () {String timestamp = datetimeutilFormatDate (new Date (), datetimeutildaTeTime_Pattern); zurück "hzno" + timestemp; } private String GetSign (MAP <String> Params, String PaternerKey) löst nicht supportedenCodingException aus {String String1 = payCreateSsign (Params, False); String StringsignTemp = String1 + "& Key =" + PaternerKey; String SignValue = DigESTUTILSMD5HEX (STRINGSIGNTEMP) TOUPPERCase (); SignValue zurückgeben; } private map <string, string> doxmlParse (String xml) löscht xmlpullParSerexception, ioException {InputStream InputStream = new bytearrayInputStream (xmlgetByTes ()); Karte <String, String> map = null; XmlpullParser pullParser = xmlpullPALLSerFactoryNewinStance () newpullParser (); PullParSerSetinput (InputStream, "UTF-8"); // Setzen Sie die XML -Daten für XML int eventType = pullParSergetEventType () an, die analysiert werden. while (eventType! brechen; case xmlpullparserStart_tag: string key = pullParSergetName (); if (keyEquals ("xml")) brechen; String value = PullParSernextText (); MAPUT (Schlüssel, Wert); brechen; Fall xmlpullParserend_Tag: Break; } eventType = pullParSernext (); } Rückgabekarte; }}4. H5 Zahlung
Die Zahlung von H5 ist eigentlich sehr einfach. Sie müssen nur die JS -Methode des eingebetteten WeChat -Browsers aufrufen (http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=7_7)
<%@ page Language = "java" contentType = "text/html; charset = utf-8" pageCoding = "utf-8"%> <%@ taglib prefix = "Spring" uri = "http: // wwwspringFrameworkOrg/Tags"%> <%String path = appringContextpatheD (); String basepath = requestGetScheme () + ": //" + appellSetServerName () + ":" + RequestGetServerport () + Pfad + "/"; %> <! DocType html public "-// w3c // dtd html 01 transitional // en Maximum-Scale = 0, Benutzer skalierbar = 0 " /> <meta name =" Apple-Mobile-Web-app-capable "Content =" Ja " /> <meta name =" Apple-mobile-Web-web-App-status-bar-Style-Style-Style-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-BAR-STATUSE ". content = "telefon = no"/> <title> testzahlung </title> <link href = "/css/csss? v = 0" rel = "styleSheet" type = "text/css"> </head> <body> <div> <div> <div> </span> </li> <li> <li> </span> </span> </li> <ul> <li> </span> </span> </li> <ul> <li> <li> </span> </span> </span> </ul> <li> <li> </span> </span> </li> <ul> <li> </span> <- 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 ("noncester"); var pg = urlparameter ("pg"); var SignType = urlParameter ("SignType"); var paysign = urlparameter ("paysign"); function onBridgeReady(){ WeixinJSBridgeinvoke( 'getBrandWCPayRequest', { "appId" : appId, //The name of the official account, passed in "timeStamp": timeStamp, //Timestamp, number of seconds since 1970 "nonceStr" : nonceStr, //Random string "package" : "prepay_id=" + pg, "signType" : SignType, // WeChat Signature Methode: "Paysign": Paysign // WeChat Signature}, Funktion (res) {if (ressinr_msg == "get_brand_wcpay_request: OK") {alertiert "). ist erfolgreich, aber es garantiert nicht, dass es absolut zuverlässig ist. } function pay () {if (typeof wexinjsbridge == "undefined") {if (documentAdDEventListener) {documentAdDeventListener ('wixinjsBridGerAy, Onbridgeready, False); } else if (documentAttACHEvent) {documentAttACHEvent ('wixinjsbridgeready', onbridgeready); DocumentAttACHEvent ('Onweixinjsbridgeready, Onbridgeready); }} else {onbridgeready (); }} </script> </body> </html> Der Effekt ist wie folgt
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.