1: Conocimiento temprano de la alfabetización de pagos de WeChat
El requisito previo es que ya existe una cuenta oficial que ha solicitado la función de pago de WeChat, y luego necesitamos obtener la cuenta de cuenta oficial APPID y la cuenta comercial de WeChat. Esto se puede encontrar en la cuenta oficial de WeChat y la plataforma de comerciante de pagos de WeChat, respectivamente. De hecho, después de solicitar con éxito la función de pago, WeChat le enviará el correo por correo electrónico. Con esta información, podemos ir a la página de soporte del servicio de pago de WeChat: https://pay.weixin.qq.com/service_provider/index.shtml
Abra esta página y haga clic en el enlace [Documento de desarrollo] en la esquina superior derecha para ingresar la página de descripción del documento de la API, que se parece a la siguiente
Elija el círculo rojo para escanear el código a pagar, lo que significa que necesitamos hacer el método de acceso. Mueva el mouse a lo anterior y le solicite que vea el documento de desarrollo. Si no sabe cómo ver esto, puede tomar una ducha e ir a la cama. Realmente no eres adecuado para un programador. La dirección es la siguiente:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 verá después de abrir en su navegador
El contenido en el que nos enfocamos y leemos ya está marcado con una elipse roja. Primero, lea las especificaciones del protocolo en [Reglas de interfaz]. Es broma, si no lee esto, desea hacer el pago de WeChat. Esto es como si quisieras recoger chicas. Primero debe recopilar información básica de fondo y comprender las características de la otra parte, de lo contrario, ¿cómo puede comunicarse a continuación? Resulta que solo los programadores que pueden recoger niñas son buenos vendedores. Después de salir del tema, analizaremos los casos y especificaciones en [Introducción de la escena]. Solo mira el logotipo de WeChat Pay. Esto es finalmente ponerlo en nuestra propia página web de pago de código QR, que parece más profesional. Luego, concéntrese en [Modo 2]
Aquí vamos a usar el método Mode 2 para realizar la función de pago del código de escaneo de la página de PC.
La explicación oficial del modo 2 por WeChat es la siguiente: "El sistema de back -end comerciante primero llama a la interfaz única unificada de WeChat Pay, el sistema de backend de WeChat devuelve el código de parámetro de enlace Code_url, el sistema de backend de comerciante genera una imagen de código QR con el valor de código_URL y el usuario escanea el código de código e inicia el pago de los puntos de inicio. pago." Si comprende, primero debemos llamar a WeChat para proporcionar una interfaz única unificada y obtener un código de información clave_URL (en cuanto a qué demonios es este código_url, no lo sé), y luego generamos un código QR a través de nuestro propio programa. Utilizo la biblioteca ZXing de Google aquí. Luego, simplemente muestre el código QR en la página web de su PC. De esta manera, el usuario del terminal pagará escaneando el código y el pago se completará. Debes estar muy emocionado de ver esto. Encuentra que el pago de WeChat es muy simple. Hay otra cosa que aún no sabemos. Los clientes saben que han pagado, pero nuestro lado del servidor aún no lo sabe. Con el coeficiente intelectual de los desarrolladores de WeChat, han pensado en este problema durante mucho tiempo. Entonces, cuando llama a la interfaz única unificada, hay un parámetro requerido que es la URL de devolución de llamada. Es decir, si el cliente paga con éxito, WeChat enviará algunos datos a nuestro propio servidor a través de esta URL, y luego analizamos los datos en segundo plano para completar nuestras propias operaciones. Solo entonces podemos saber si el cliente realmente ha pagado a través de WeChat. De esta manera, todo el proceso ha terminado, y este es el patrón 2. WeChat utiliza un diagrama de tiempo para representar este proceso.
Es complicado de expresar y parece ser difícil. Para resumir, lo que nuestro servidor debe hacer es el siguiente:
1. Pase los parámetros correctos (por supuesto, nuestra URL de devolución de llamada) y la verificación de la firma a través de la interfaz única unificada, y obtenga los datos correspondientes de Code_URL de los datos de retorno.
2. Basado en los datos Code_URL, generamos una imagen de código QR y la mostramos en la página web del navegador.
3. Agregue nuestro propio procesamiento de lógica comercial en la URL de la devolución de llamada.
La alfabetización ha terminado ahora, y finalmente sabes qué tipo de proceso pagar escaneando el código. Echemos un vistazo a su uso relevante de API y hagamos un buen trabajo al procesar cada paso.
Dos: proceso de desarrollo
Antes de desarrollar el código, prepare algunas cosas primero.
1. Agregue la dependencia de Maven de Zxing
2. Agregue la dependencia de JDom Maven
3. Descargue el programa de demostración SDK de la versión Java, la dirección está aquí
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
Necesitamos md5util.java y xmlutil.java dos archivos
4. Utilizamos HTTPClient Versión 4.5.1, recuerde agregar dependencias de Maven
Después de que se realicen los preparativos anteriores, continúe leyendo:
Primero, necesitamos llamar a la interfaz única unificada de WeChat. Cuando hacemos clic en el single unificado en [Lista de API], veremos una página como esta:
Tomando la situación real de mi llamada como ejemplo, son necesarios los siguientes parámetros. Para la comodidad de todos, lo he convertido en un objeto Pojo. El código es el siguiente:
clase pública unifiederDto implementa weixinconstants {private string appid; private string body; private string dispositivo_info; private string mch_id; private string nonce_str; private string notify_url; private string openId; private string out_trade_no; private string spbill_create_ip; private int total_fee; {this.appid = appid; this.mch_id = wxpaymentAccount; this.device_info = dispositivo_info_web; this.notify_url = callback_url; this.trade_type = comercial_type_native;} public string getAppid ()} public setappid (string appid) (string appid) appid;} public String getBody () {return Body;} public void setBody (string body) {this.body = body;} public String getDevice_info () {return Device_info;} public void setDevice_info (String Device_info) {this.device_info = Device_info;} public String getmch_id () mch_id;} public void setmch_id (string mch_id) {this.mch_id = mch_id;} String String getNonce_str () {return nonce_str;} public void setnonce_str (string nonce_str) {this.nonce_str = nonce_str;} public string getNoTify_url () {return Notife Notify setNotify_Url (String notify_url) {this.notify_url = notify_url;} public String getopenid () {return OpenId;} public void setOpenid (string abreDID) {this.OpenId = OpenID;} out_trade_no) {this.out_trade_no = out_trade_no;} public String getSpbill_create_ip () {return spbill_create_ip;} public void setspbill_create_ip (string spbill_create_ip) getToTal_fee () {return Total_fee;} public void settotal_fee (int total_fee) {this.total_fee = total_fee;} public string getTrade_type () {return trade_type;} public void setTrade_Type (string_type) {this.trade_type = tradee = comercial;} public void setTrade_Type (string_type) {this.trade_type = trade = comercial {return firm;} public void setSign (firma de cadena) {this.sign = firme;} public String getProduct_id () {return product_id;} public void setProduct_id (string product_id) {this.product_id = product_id;} public String GeneratexmlContent () {String xml = "<<xml>" " +" + " +" + " +" + " +" + this this this / this this this / this this + this thats. " + this this THEP "</appid>" + "" + this.body + "" + "<vice_info> web </vice_info>" + "<mch_id>" + this.mch_id + "</mch_id>" + "<nonce_str>" + this.nonce_str + "</nonce_str>" + "notify_url>" + this.notify_url + "</notify_url>" + "<ut_trade_no>" + this.out_trade_no + "</out_trade_no>" + "<product_id>" + this.product_id + "</product_id>" + "<pbill_create_ip>" + this.spbill_create_ip + "</spbill_createe> + "<total_fee>" + string.valueOf (this.total_fee) + "</total_fee>" + "<skinte_type>" this.trade_type + "</trade_type>" + "<sign>" + this.sign + "</firma>" + "</xml>"; return xml;} string public string () () CONTENTO () this.appid + "& body =" + this.body + "& dispositivo_info = web" + "& mch_id =" + this.mch_id + "& nonce_str =" + this.nonce_str + "? ify_url =" + this.notify_url + "& out_trade_no =" + this.out_trade_NO + "& product_id =" + " +" & out_trade_no = " + this.out_trade_NO +" & Product_id = " "& spbill_create_ip =" + this.spbill_create_ip + "& total_fee =" + string.valueOf (this.total_fee) + "& trade_type =" + this.trade_type; content = content + "& key =" + weixinconstants.md5_api_key; string firature = weixinpaypay "UTF-8"); return Signature.ToUpperperCase ();}}La explicación de cada variable miembro se puede encontrar en la descripción de [interfaz única unificada].
Después de esto, debemos completar el contenido que establecemos, llamar a la interfaz para obtener los datos de retorno, obtener los datos Code_url y generar una imagen bidimensional en función de él, devolver la dirección de imagen a la página web de PC y luego se mostrará. Aquí tomaremos una nota especial de que cuando haga clic en el pago de WeChat, llamaremos a nuestro propio controlador SpringMVC a través del método AJAX y luego completemos el análisis de interfaz única unificada de WeChat a través de HTTPClient en el método correspondiente del controlador para obtener los datos XML devueltos por Code_URL, y luego generar el código QR y regresar a la página principal. El código implementado en el controlador es el siguiente:
Map<string,object> result=new HashMap<string,object>();UnifiedorderDto dto = new UnifiedorderDto();if(cash == null || "".equals(cash)) {result.put("error", "cash could not be zero");return result;}int totalfee = 100*Integer.parseInt(cash);logger.info("total recharge cash : " + TotalFee); dto.setProduct_id (String.ValueOf (System.CurrentTimEmillis ())); dto.setBody ("reparar"); dto.setnonce_str (string.valueOf (system.nanotime ())); loginfo loginfo = loginfoutfoutil.getLoginfo (); //////Antenty Number, Number, Number, Number, Number, Number, Number, Number, Number, Number, NÚMERO DE IDENTICIO + UUD NÚMERO DE INDENTIMIENTO DE IDENTICIÓN DE INDENTIMIENTO DE INDENTIMIENTO DE INDENTIMIENTO. Flagador de identificación DTO.Setout_trade_NO ("Su número de pedido + información clave, se envía de regreso después de la devolución de llamada de WeChat, puede verificar"); dto.settotal_fee (totalfee); dto.setspbill_create_ip ("127.0.0.1"); // generar firmado.setsign (dto.makesign ()); dto.makesign ()); logger.info ("contenido xml:" + dto.generatexmlContent ()); try {httpclient httpclient = httpclientbuilder.create (). build (); Httppost post = new httppost (weixinconstants.unifiedorder_url); post.addHeader ("content-type", "text/xml; charset = utf-8"); stringEntity xmlentity = new StringEntity (dto.GenerAxmlContent (),,,,,,,, ContentType.Text_Xml); post.SetEntity (xMlEntity); httPResponse httPResponse = httpClient.Execute (post); string responsexml = entityUtilss.ToString (httpesponse.Tpesponse.getEntity (), "utf-8"); Code_url ContentMap <String, String = "" ResultMap = (Map <String, String = "">) xmlutil.doxmlParse (respuestaxml); logger.info ("Response Code_url:" + resultMap.get ("Code_Url")); String CodeURl = ResultMap.get ("Code_Url); ! "". EQUALS (CODEURL))) {String imageUrl = generateQrCode (codeUrl); result.put ("qrimage", imageUrl);} post.releaseConnection ();} capt (excepción e) {e.printstackTrace ();} result.put ("éxito", "1"); return resultado; </String,> </String,> </String, Object> </String, Object>El código que genera el código QR es el siguiente:
privado string generateQRCode (String CodeUrl) {File Folder = New File (BasePath + "QrCode"); if (! Foldler.Exists ()) {Foletler.mkdirs ();} String f_name = uuidUtil.uuid () + ".png"; intente {file f = file (basePath + "qrcode", filt); filettuM fio = new FileOutputStream (f); MultiformAtWriter MultiformAtWriter = new MultiformAtWriter (); Map Hints = new Hashmap (); tints.puts (codeDintType.character_set, "UTF-8"); // Establezca el tipo de apartamento de caracteres tipo bitMatrix bitMatrix = null; bitMatrix = multiformatwriter.enCode (codeUrl, barcodeFormat.qr_code, 300, 300, sugerencias); bufferedImage image = tObufferedImage (bitMatrix); // emitir la imagen QR transmisión de la imagen.write.write (image, "png", ", fio); f_name);} catch (Exception e1) {e1.printstacktrace (); return null;}}En este momento, después de escanear el código WeChat QR en el cliente, utilizaremos la devolución de llamada para hacer la URL y devolvernos los datos. Completaremos nuestro propio procesamiento en el método de devolución de llamada. Es importante tener en cuenta aquí que su interfaz de devolución de llamada debe implementarse a través del método de publicación HTTP, de lo contrario, los datos XML no serán aceptados. El código para el procesamiento de devolución de llamada es el siguiente:
@RequestMapping (value = "/your_callback_url", método = requestmethod.post) @ResponseBodyPublic void finkepayment (httpservletRequest request, httpServletResponse Response) {try {logger.info ("Comience a llamar de Weixin Server:" + request.getRemotehost (); Hashmap <string, string = ""> (); inputStream inputStream = request.getInputStream (); // Leer el flujo de entrada saxBuilder saxBuilder = nuevo saxBuilder (); document Document = SaxBuilder.Build (InputStream); // Obtenga el elemento Root de XML Root = document.getroOtelement ();// Get All Chado root.getChildren (); iterator it = list.iterator (); while (it.hasnext ()) {element e = (element) it.next (); string k = e.getName (); string v = ""; list children = e.getChildren (); if (children.isEmpty ()) {v = e.gettxtnormaly ();} más {v = Xmlutil.getChildrenText (niños);} resultMap.put (k, v);} // Verifique la firma! ! ! /*String [] keys = resultMap.KeySet (). ToArray (new String [0]); arrays.sort (keys); string kvParams = ""; for (int i = 0; i <keys.length; i ++) = "" {= "" if (tecla [i] .equals ("sign") = "continuar; ="} = "" "" "" if (i = "=" 0) = "" kvparams = "" + = "(teclas [i]" "=" + resultMap.get (tecla [i]));} else {kvParams + = ("&" = "" Keys [i] = "" & key = " + weixinconstants.md5_api_key; string md5esign = = WeixInpaymentUtil.md5encode (esign, "utf-8"); = "" if (! Md5esign.equals (resultMap.get ("signo")) = "" return; = ""}*= "" Close stream = "" Free Resource = "" InputStream.Close (); = "" InputStream = "NULL; returncode = "resultMap.get (" return_code ");" Outtradeno); = "" logger.info ("total_fee =" "nfee); =" "Process de procesamiento empresarial =" "if (" éxito ".equals (returncode)) =" "toDo: =" "your =" "Business =" "Process =" "add =" aquí = "" respuesta.getwriter (). print (xmlutil.getResultxml (resultMap.get ("return_code"), = "" resultMap.get ("return_code")); = "" else = "" resultMap.get ("return_msg")); = "" Catch (IoException = "Ioe) =" "IST.PrintstAttAtAcAcA (jdomexception = "" e1) = "" e1.printstacktrace (); = ""}Recuerde usar las dos clases de XMLUTIL y MD5UTIL utilizadas en la versión oficial de Java de WeChat Demo. El código de demostración se puede encontrar en su página de demostración oficial. Las dependencias de Maven relevantes son las siguientes:
<Spendency> <MoupRoD> JDOM </Groupid> JDOM </sartifactid> <versión> 1.1 </versión> </pendency> <pendency> <uproupid> com.google.zxing </groupid> core </arifactid> <versión> 3.3.0 </pelipencion> </pendency>
Finalmente, debo prestar especial atención a la firma. Descargué directamente la versión Java del programa de demostración del sitio web oficial de WeChat para obtener la firma. Le sugiero que haga lo mismo, porque esta es la mejor opción para garantizar que la firma MD5 sea consistente. Para el algoritmo específico para generar firmas, puede ver el documento oficial de WeChat. Aquí recomendamos encarecidamente que deba explicar la API oficial. El 90% de los diversos problemas que encuentra en el desarrollo es porque no lee los documentos oficiales, ¡pero confía en el blog de alguien! Este es el verdadero propósito y propósito de mi escritura este artículo. Según los documentos oficiales, lo implementé con mi código Java. Escanee el código QR en las páginas web de WeChat PC y el pago del pago definitivamente volará en su aplicación web.
Lo anterior es la implementación de Java SpringMVC de la página web de PC WeChat QR Code Pago (versión completa) introducida por el editor. Espero que sea útil para todos. Si tiene alguna pregunta, déjame un mensaje y el editor responderá a todos a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!