Recientemente, el proyecto requiere el pago de WeChat, y luego miré el pago de la cuenta oficial de WeChat. Aunque no es difícil, los detalles aún deben recibir atención. Pasé la mayor parte del día escribiendo una demostración y probé el proceso de pago por completo. Compartamos la experiencia del pago de la cuenta oficial de WeChat a continuación.
1. Configure el pago de la cuenta oficial de WeChat
Necesitamos configurar la dirección de pago de la cuenta oficial de WeChat y la lista blanca de pruebas.
Por ejemplo: la dirección de la página JS de pago es http://www.xxx.com/shop/pay/
Luego aquí se configura www.xxx.com/shop/pay/
2. Proceso de desarrollo
Pida prestada la cuenta oficial de WeChat para pagar la API (dirección http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=7_4), que necesitamos desarrollar está marcado en rojo. como sigue:
3. Realice un pedido con el servidor WeChat
Llame a la interfaz única unificada para que pueda obtener el pago prepay_id de WeChat (http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=9_1).
Antes de llamar a esta interfaz, hay varios campos que son OpenID que deben completarse para el pago H5.
3.1 Obtenga OpenID
Puede usar el formulario de autorización web (http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html)
Enviar el siguiente enlace en WeChat
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=url&response_type=code&scope=snsapi_base&state=123#wechat_redirect
3.2 Coloque una orden para obtener anticipación_id
El código es el siguiente, que en realidad está enviando un archivo XML a través de la publicación para obtener el prepay_id enviado desde el servidor WeChat.
import java.io.bytearrayInputStream; importar javaioioexception; importar javaioInputStream; importar javiounsupportedEncodingException; importar javautildate; importar javautilhashmap; importar javautiliterator; importar javautilmap; importar javautilmapentry; importar javautilrandom; import javaxservlethttphttpservletRequest; import javaxservlethttphttpservletResponse; importar OrgapachecommonscodecdigestdigestUtils; importar orgspringframeWorkSteTypeController; importar orgspringframeworkwebbindannotationRequestMapping; import ORGXMLPULLVXMLPULLPARSER; importar orgxmlpullvxmlpullparserException; import ORGXMLPULLVXMLPULLPARSERFactory; import ComfasterxmljackSondatabIndjsonnode; importación comgsonoauthoauth; importar comgsonoauthpay; import comgsonutilhttpkit; importar comsyutildateTimeutil; Importar comsyutiljsonutil; @Controller @RequestMapping ("/Pay") Public Class WxPayController {@RequestMapping (value = "wxprepaydo") public void jspay (httpservletRequest solicitud, httpservletResponse respuesta, cadena de cadena) Excepción {// OpenId = SessionUtilgetatt (solicitud, "OpenId", "); if (openId == null) {OpenID = getUseropenID (request); } String appid = "wx16691fcb0523c1a4"; String Paternerkey = "Iningfeng1234567fdfwfdfd1ss234567"; Cadena out_trade_no = getTradeno (); Map <string, string> paramap = new HashMap <String, String> (); paramapput ("appid", appid); paramapput ("adjuntar", "prueba"); paramapput ("cuerpo", "pago de compra de prueba"); 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 ("notify_url", "http: // wwwxxxco/bank/page/wxnotify"); String Sign = GetSign (Paramap, Paternerkey); paramapput ("firmar", firmar); // orden unificado https: // apimchweixinqqcom/pay/unifiedorder string url = "https: // apimchweixinqqcom/pay/unifiedorder"; Cadena xml = arrayToxml (paramap); Cadena xmlstr = httpkitPost (url, xml); // cadena de identificación del producto prepago prepay_id = ""; if (xmlStrinDexof ("éxito")! = -1) {map <string, string> map = doxmlParse (xmlstr); prepay_id = (string) mapget ("prepay_id"); } Map <string, string> paymap = new Hashmap <String, String> (); PayMapput ("Appid", Appid); PayMapput ("Timestamp", create_timestamp ()); PayMapput ("Non -Cestr", create_nonce_str ()); payMapput ("firma", "md5"); payMapput ("paquete", "prepay_id =" + prepay_id); String paySign = GetSign (PayMap, Paternerkey); PayMapput ("PG", prepare_id); PayMapput ("PaySign", PaySign); WebUTIlResponse (respuesta, webutilpackjsonp (devolución de llamada, jsonutilwarpjsonnoderesponse (jsonutilObjectToJsonnode (PayMap)) toString ())); } / ** * mape a xml * * @param arr * @return * / public string arrayToxMl (map <string, string> arr) {String xml = "<xml>"; Iterator <Entry <String, String >> iter = ARRENTRYSET () ITERATOR (); while (iterhasNext ()) {Entry <String, String> Entry = Iternext (); Clave de cadena = EntrygetKey (); Cadena val = entrygetValue (); xml + = "<" + key + ">" + val + "</" + key + ">"; } xml += "</xml>"; return xml; } // Get OpenID String private getUseropenId (solicitud httpservletRequest) lanza la excepción {String Code = requestGetParameter ("código"); if (code == null) {string OpenId = requestGetParameter ("OpenID"); regresar OpenID; } Oauth o = new Oauth (); String token = oGetToken (código); JSONNODE NODO = JSONUTILSTRINGTOJSONNODE (TOKEN); String OpenId = nodeget ("OpenID") asText (); regresar OpenID; } cadena privada create_nonce_str () {string chars = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789"; Cadena res = ""; for (int i = 0; i <16; i ++) {random rd = new Random (); res += charscharat (rdNextInt (charslength () - 1)); } return Res; } cadena privada getAddrip (httpservletRequest request) {return requitgetRemoteaddr (); } private String create_timestamp () {return LongToString (SystemCurrentTimemillis () / 1000); } String private getTradeno () {String timestamp = DateTimeUtilFormatDate (new Date (), DateTimeUtildateTime_Pattern); return "Hzno" + TimeStamp; } string private getSign (map <string, string> params, string paterkey) lanza unsupportedEncodingException {string string1 = payCreateSign (params, falso); String StringsignTemp = String1 + "& Key =" + Paternerkey; String SignValue = DigestUtilsmd5Hex (StringsignTemp) toupperCase (); Valor de retorno de Sign; } MAP privado <String, String> doxmlParse (String xml) lanza XMLPullParSerException, ioException {inputStream inputStream = new ByteArrayInputStream (xmlgetBytes ()); Map <string, string> map = null; XMLPULLPARSER PULLPARSER = XMLPULLPARSERFACTORYNEWINSTANCE () newPullParser (); PullParSerSetInput (InputStream, "UTF-8"); // Establezca los datos XML a analizar para XML int EventType = PullParSerGetEventType (); while (eventType! = xmlpullparserend_document) {switch (eventType) {case xmlpullparserstart_document: map = new Hashmap <String, String> (); romper; case xmlpullparserstart_tag: string key = PullparsergetName (); if (keyequals ("xml")) ruptura; Valor de cadena = PullParserNextText (); Maput (clave, valor); romper; case xmlpullparserend_tag: break; } eventType = PullParserNext (); } mapa de retorno; }}4. Pago de H5
El pago de H5 es realmente muy simple. Solo necesita llamar al método JS del navegador incrustado WeChat (http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=7_7)
<%@ page lenguaje = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <%@ taglib prefix = "spring" uri = "http: // wwwspringframeworkorg/tags"%> <%string path = requestgetContextPath (); String BasePath = requestGetScheme () + ": //" + requestgetServerName () + ":" + requestgetServerPort () + ruta + "/"; %> <! DocType html público "-// w3c // dtd html 01 transitional // en" "http: // wwworg/tr/html4/louedtd"> <html> <head> <meta charset = "utf-8"/> <meta name = "viewport" content = "width = dispositivo width, inicial, inicial = 0. Maximum-Scale = 0, user-Scalable = 0 " /> <meta name =" Apple-Mobile-Web-app-Capable "Content =" Sí " /> <Meta name =" Apple-Mobile-Web-App-STATUS-BAR "Content =" Black " /> <Meta Name =" Apple-Mobile-Web-APP-STATUS-BAR-SSTYLE "Content =" Black " /> <Meta name =" Meta-Detection " content = "Telephone = no"/> <title> Test Pago </title> <link href = "/css/csss? V = 0" rel = "stylesheet" type = "text/css"> </head> <body> <div> <div> wechat js prueba de pago </div> <liv> <li> <li> <span> test Information </span> </li> </li> </ll> </ll> <p> <P> </ult </ul> href = "javascript: pay ();"> pay Now </a> </p> </div> </div> <script type = "text/javaScript" src = "/js/zeptominjs"> </script> <script type = "text/javaScript" src = "/js/comúnjs"> </script> <cript tipo = "text/javaScript" Varing = VarAd = VarAd = VarAd = VarAd = VarAd = VarAd = Varing = VarAd = Var Appid = VarAd = VarAd = Varing = VarAd = Varing = Varing = Varing = Varing = Varing = Varing = Varing = Varing = Varing = Varing = Varing = VAR APPID = VAR APCED = VAR = VAR APCEL. urlParameter ("Appid"); var timestamp = urlParameter ("TimeStamp"); var noncestr = urlParameter ("Non -CESTR"); var pg = urlparameter ("PG"); var firma de firme = urlparameter ("firmar"); 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" : FIRATO, // Método de firma WeChat: "PaySign": PaySign // WeChat Signature}, function (res) {if (reserr_msg == "get_brand_wcpay_request: ok") {alerta ("paga exitoso"); es exitoso, pero no garantiza que sea absolutamente confiable. } function pay () {if (typeOf weixInjSbridge == "Undefined") {if (documentDeventListener) {documentAdDeventListener ('weixinjsbridgeReady', onbridgeReady, false); } else if (documentAtTachEvent) {DocumentAttACheVent ('weixinjsbridgeReady', onbridgeReady); DocumentAtTachEvent ('onweixinjsbridgeReady', onbridgeReady); }} else {onbridgeReady (); }} </script> </body> </html> El efecto es el siguiente
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.