1. Descripción general del pago en línea
¿Qué es el pago en línea? Así es, ¡solo gasta dinero en línea! Todos deben haber tenido tal experiencia. Pero es posible que no sepa mucho sobre la "historia interna" del pago en línea, ¡aprendamos a continuación!
Si comienza a ejecutar un sitio web de comercio electrónico ahora, los usuarios deben pagar si compran algo. Su sitio web debe poder conectarse a los principales bancos. Luego, después de completar el pago, ¡regrese a su sitio web para mostrar "éxito de pago"!
Esto es lo que vamos a hacer hoy, conectarse al sistema bancario en línea del banco para completar los pagos. Para ser más profesional, lo llamamos "desarrollar una puerta de entrada para pagos en línea"
2. Dos formas de pagar en línea
Hay dos formas de pagar en línea:
*El comercio electrónico se conecta directamente con los bancos
*El comercio electrónico se conecta con los bancos a través de plataformas de pago de terceros
El comercio electrónico se conecta directamente con los bancos, lo que requiere el consentimiento del banco, pero desafortunadamente, los bancos son muy "increíbles" y no a nadie que quiera conectarse con ellos. Si su negocio de comercio electrónico tiene un gran flujo diario de capital, el banco se conectará con usted porque todo el dinero pagado por el cliente al comercio electrónico se deposita en la cuenta bancaria. Pero si el flujo de capital es pequeño, ¡el banco no le prestará atención!
Cuando los sitios web pequeños son insuficientes en fondos y no pueden conectarse con los bancos, elegirán cooperar con compañías de pago de terceros. Todos también entienden qué empresas son esto, como Alipay, Yibao, Fortune, Kuaiqian y otras compañías son relativamente famosas en China. ¡Estas compañías pueden conectarse con los bancos (porque tienen fondos suficientes), y luego pequeñas compañías de comercio electrónico pueden conectarse con ellos! ¡Pero terceros requieren una tarifa! Los terceros generalmente cobran el 1% de las tarifas de comercio electrónico, pero no cobrarán el dinero de los clientes.
A través de la imagen de arriba, puede saber que el nombre del centro comercial, el número de pedido RMB y el tiempo de pedido se mostrarán en la página del banco. . . , ¿Cómo saben los bancos sobre estas cosas? Por supuesto, se transmite a los bancos por comercio electrónico. Después de que la compañía de comercio electrónico se conecta con el banco, la compañía de comercio electrónico debe aprobar los parámetros requeridos por la página bancaria a la página bancaria, ¡por lo que la página del banco puede mostrar estos datos!
Sin embargo, ¡nuestro centro comercial no solo puede conectarse a un banco! ¡Debemos conectarnos con las cuatro compañías de BOC, CCB, ABC e ICBC! Los parámetros de acoplamiento requeridos por diferentes bancos son diferentes, lo que significa que necesitamos escribir diferentes códigos de acoplamiento para diferentes bancos durante el desarrollo. ¡Esta es también la desventaja de conectarse directamente con los bancos! Por supuesto, la conexión directa con los bancos también es beneficiosa, es decir, la seguridad no es necesaria, ¡sin tarifas de manejo!
Desarrollar diferentes códigos para diferentes bancos (desventajas);
Seguridad (ventajas);
Sin tarifa de manejo (ventajas);
Los pequeños bancos de comercio electrónico no permiten conexiones (desventajas).
Como se muestra en la figura anterior, después de que el cliente hace clic para confirmar el pago en el sitio web de comercio electrónico, se le dirigirá al sitio web de terceros, y luego el tercero se conectará con el banco. ¡Esto muestra que el comercio electrónico necesita pasar parámetros a terceros! El tercero luego pasa los parámetros al banco. La ventaja de este método es que solo debe desarrollarse para terceros sin proporcionar parámetros a cada banco. Es una tarea de terceros proporcionar parámetros a cada banco. Sin embargo, si un tercero no es viejo y confiable, si el tercero se declara en bancarrota y la gente se escapa, entonces su dinero se habrá ido. Debido a que el dinero pagado por el cliente no va a su cuenta bancaria, se paga a la cuenta bancaria del tercero y usted tiene una cuenta en el tercero. Además, los terceros también cobran una tarifa de manejo, generalmente 1%, que no es un número pequeño (es realmente malo).
3. A través de reglas de pago en línea de terceros
Si el comercio electrónico quiere registrar a un comerciante con un tercero, debe proporcionar la certificación ICP al tercero. Una licencia comercial de ICP es una licencia comercial del sitio web que debe ser procesada por un sitio web comercial de acuerdo con las "medidas de gestión de Internet" nacionales. Si no es así, es ilegal operar.
¡No podemos solicitar ICP solo por la práctica! Entonces no podemos registrar a un comerciante con un tercero. Sin embargo, ya tenemos comerciantes preparados registrados en Yibao, por lo que este paso puede ignorarse.
Cuando se registre con éxito en Yibao, Yibao le dará las siguientes cosas:
Abra una cuenta en Yibao (es decir, código comercial): 10001126856
Especificación de acceso de Yibao: un archivo CHM CLASE DE ALGORITMO DE Cifrado simétrico: PaymentUtil.java
Clave: 69CL522AV6Q613II4W6U8K6XUW8VM1N6BFGYV769220IUYE9U37N4Y7RI4PL
En la especificación de acceso de Yibao, podemos encontrar la pasarela de pago de Yibao, que en realidad es una URL, una URL utilizada para conectarse con Yibao: https://www.yeepay.com/app-merchant-proxy/node
En la especificación de acceso Yibao, también puede encontrar los parámetros requeridos por Yibao. Cuando el comercio electrónico se conecta con Yibao, estos parámetros deben pasar a la pasarela de pago:
Dirección de solicitud oficial: https://www.yeepay.com/app-merchant-proxy/node
Estos parámetros deben agregarse a la URL.
Sin embargo, tenga en cuenta que los valores de estos parámetros deben estar encriptados. ¡Tanto la clave de cifrado como el algoritmo de cifrado Yibao proporcionarán!
donde p8_url indica a qué página volver cuando el pago sea exitoso. Esto significa que necesitamos escribir una página que muestre los resultados. Después de que el pago sea exitoso, un tercero redirigirá a la página de devolución que especificamos, y también nos traerá algunos parámetros. Nuestra página necesita obtener estos parámetros y mostrarlos en la página. Los siguientes son los parámetros devueltos por el tercero:
4. Desarrolle un sistema de pago en línea de terceros
paso:
Página index.jsp: un formulario enviado a BuyServlet. Los elementos del formulario incluyen: número de pedido, monto de pago, selección bancaria
BuyServlet: Obtenga datos de formulario y prepárese para conectarse a una puerta de enlace de terceros. Debido a que solo se dan 3 parámetros en la página index.jsp, y hay muchos parámetros requeridos por terceros, los parámetros no dados por la página se complementan con BuyServlet. Y los parámetros también deben estar encriptados, que también deben completarse en BuyServlet
Backservlet: cuando el usuario paga con éxito, el tercero redirigirá a la página de devolución que especificamos. Utilizamos Backservlet como la página de retorno, que se utiliza para recibir parámetros pasados por el tercero y los mostramos en la página.
Debido a que ya tenemos un negocio registrado en Yibao, no tenemos que registrar un negocio por nosotros mismos. Así que aquí está usar Yibao como una plataforma de pago de terceros para las pruebas. Debido a que no tengo comercio electrónico (comercio electrónico que debe aprobar la certificación ICP), tampoco puedo registrar un negocio con un tercero.
El negocio de Yibao que estamos utilizando ahora es proporcionado por Chuanzhi Podcast, un negocio registrado por Baba Sports Network en Yibao. Por lo tanto, el dinero pagado durante la prueba fue otorgado a la compañía registrada por Baba Sports Network en Yibao.
Paso 1: index.jsp
<form action="" method="post"> Order number: <input type="text" name="p2_Order"/><br/> Amount: <input type="text" name="p3_Amt"/><br/> Select a bank: <input type="radio" name="pd_FrpId" value="ICBC-NET-B2C"/> Industrial and Commercial Bank of China<img src = "bank_img/icbc.bmp" align = "middle"/> <input type = "radio" name = "pd_frpid" valor = "boc-net-b2c"/> banco de China <img src = "bank_img/icbc.bmp" align = "medio"/> <input type = "name =" pd_frpid "valor" valor = "bax2c "b" China <img src = "bank_img/bc.bmp" align = "Middle"/> <br/> <input type = "radio" name = "pd_frpid" valor = "abc-net-b2c"/> banco agrícola de China <img src = "bank_img/abc.bmp" align = "medio"/> <input type = "name =" name = "pd_frpid" "pd" pd_frpid "" pd " value = "ccb-net-b2c"/> construction bank <img src = "bank_img/ccb.bmp" align = "middle"/> <br/> <input type = "radio" name = "pd_frpid" valor = "boco-net-b2c"/> banco de comunicaciones <img src = "bank_img/bcc.bmp" medias " <input type = "enviar" value = "confirmar pago"/> </form>
El valor correspondiente de cada banco:
Paso 2: buyservlet.java
Public Class BuyServlet extiende httpservlet {public void dopost (httpservletRequest solicitud, respuesta httpServletResponse) lanza ServletException, ioexception {request.setcharacterEncoding ("UTF-8"); respuesta.setContentType ("text/html; charset = utf-8"); Cadena p0_cmd = "buy"; // El tipo de negocio, el valor fijo es comprar, es decir, "buy" String p1_merid = "10001126856"; // La cadena de nombre de negocios P2_order = request.getParameter ("p2_order"); // El número de pedido String p3_amt = request "CNY";// The transaction currency, the fixed value is CNY, indicating RMB String p5_Pid = "";// Product name String p6_Pcat = "";// Product name String p7_Pdesc = "";// Product description String p8_Url = "http://localhost:8080/buy/BackServlet";// Product description String p8_Url = "http: // localhost: 8080/buy/backservlet"; // La página de devolución de E-Commerce, cuando el pago sea exitoso, Yibao redirigirá a esta página String P9_Saf = ""; // Dirección de entrega String pa_mp = ""; // Extensión de producto String PD_FRPID = request.getParameter ("PD_FRPID"); Cadena pr_needResponse = "1"; // Mecanismo de respuesta, el valor fijo es 1 // clave, proporcionada por Yibao, solo los comerciantes y Yibao conocen esta clave. Cadena keyValue = "69CL522AV6Q613II4W6U8K6XUW8VM1N6BFGYV769220IUYE9U37N4Y7RI4PL"; // A través de los parámetros, claves y algoritmos de cifrado anteriores, se genera el valor HMAC // el orden de los parámetros es necesario. Si no hay valor, no se puede dar nulo, pero se debe dar una cadena vacía. String hmac = paymentUtil.BuildHMAC (P0_CMD, P1_MERID, P2_ORDER, P3_AMT, P4_CUR, P5_PID, P6_PCAT, P7_PDESC, P8_URL, P9_SAF, PA_MP, PD_FRPID, PR_NEEDRESPONSE, KEYVALUE); // Conecte todos los parámetros a la dirección de la puerta de enlace String url = "https://www.yeepay.com/app-merchant-proxy/node"; url + = "? p0_cmd =" + p0_cmd + "& p1_merid =" + p1_merid + "& p2_order =" + p2_order + "& p3_amt =" + p3_amt + "& p4_cur =" + p4_cur + "& p5_pid =" + p5_pid + "& p6_s p6_Pcat + "&p7_Pdesc=" + p7_Pdesc=" + p7_Pdesc + "&p8_Url=" + p8_Url=" + p8_Url + "&p9_SAF=" + p9_SAF + "&pa_MP=" + pa_MP + "&pd_FrpId=" + pd_FrpId + "&pr_NeedResponse=" + pr_needResponse + "& hmac =" + hmac; System.out.println (URL); // redirigir a la respuesta de la puerta de enlace. Sendedirect (URL); }}Paso 3: Backservlet
Public Class Backservlet extiende httpservlet {public void doget (httpservletRequest solicitud, respuesta httpservletResponse) arroja servletException, ioexception {respuesta.setContentType ("text/html; charset = utf-8"); / * * Yibao proporcionará una serie de parámetros de resultados, podemos obtener lo que necesitamos en él * Obtenga el resultado de pago: R1_Code, 1 significa que el pago es exitoso. * Obtenga la cantidad de pago: R3_AMT * Obtenga el número de pedido de comercio electrónico: R6_order * Obtenga el tipo de retorno de resultados: R9_BType, 1 significa retorno de redirección, 2 significa retorno punto a punto, * pero no podemos recibir punto a punto, porque nuestras IP son todas las IPS LAN. */ String r1_code = request.getParameter ("r1_code"); Cadena r3_amt = request.getParameter ("r3_amt"); Cadena r6_order = request.getParameter ("R6_order"); Cadena r9_btype = request.getParameter ("r9_btype"); if (r1_code.equals ("1")) {if (r9_btype.equals ("1")) {respuesta.getwriter (). imprime ("<h1> pay con éxito! </h1>"); // de hecho, cuando el pago es sin éxito, yibao no regresará a este servlet. "<br/>"); respuesta.getWriter (). print ("El número de pedido es:" + R6_order + "<br/>"); }}}}Herramientas para obtener HMAC proporcionado por el pago de Yibao
clase pública PaymentUtil {cadena estática privada EncodingCharset = "UTF-8"; /*** Generar el método HMAC** @param p0_cmd Tipo de negocio* @param p1_merid Número de comerciante* @param p2_order Número de pedido de comerciante* @param p3_amt Cantidad de pago* @param p4_cur transacciones moneda* @param p5_pid nombre del producto* @param p6_pcat type* @param p7_pdescdesc. the merchant receiving payment success data* @param p9_SAF Delivery address* @param pa_MP Merchant extension information* @param pd_FrpId Bank code* @param pr_NeedResponse response mechanism* @param keyValue Merchant key* @return */ public static String buildHmac(String p0_Cmd,String p1_MerId, String p2_Order, String p3_Amt, String p4_cur, string p5_pid, string p6_pcat, string p7_pdesc, string p8_url, string p9_saf, string pa_mp, string pd_frpid, string pr_needResponse, string keyValue) {stringBuilder svalue = new StringBuilder (); // Tipo de negocio svalue.append (P0_CMD); // número comercial svalue.append (p1_merid); // número de pedido comercial svalue.append (p2_order); // Monto de pago svalue.append (p3_amt); // comercio de moneda svalue.append (p4_cur); // nombre del producto svalue.append (p5_pid); // Tipo de producto svalue.append (p6_pcat); // Descripción del producto svalue.append (p7_pdesc); // Dirección del comerciante que recibe datos de éxito de pago svalue.append (P8_URL); // dirección de entrega svalue.append (p9_saf); // Información de extensión comercial svalue.append (pa_mp); // código bancario svalue.append (PD_FRPID); // mecanismo de respuesta svalue.append (pr_needResponse); devolución de pagosUtil.hmacSign (svalue.toString (), keyValue); } /*** Volver a la verificación Método HMAC** @param HMAC Código de verificación cifrado enviado por la puerta de entrada de pago* @param p1_merid Número de comerciante* @param r0_cmd Tipo de negocio* @param R1_Code Resultado de pago* @Param R2_trxid Yibao Pague Transacción Número de flujo* @Param R3_Amt PAGO* @Param R4_CURAM CURAM CURAM CURAM Nombre del producto R5_PID* @param R6_order Número de orden de comerciante* @param r7_uid yibao ID de miembro de pago* @param R8_MP Información de extensión del comerciante* @param r9_btype Transaction Tipo de retorno de resultados* @Param KeyValue Key* @Return*/ public Static VerifyCallback (String HMac, String P1_Merid, String R0_cmd, String Bopy, String Bopy. r1_code, string r2_trxid, string r3_amt, string r4_cur, string r5_pid, string r6_order, string r7_uid, string r8_mp, string r9_btype, string keyValue) {stringBuilder svalue = new StringBuilder (); // número comercial svalue.append (p1_merid); // Tipo de negocio svalue.append (R0_CMD); // resultado de pago svalue.append (r1_code); // Número de transacción de pago Yibao svalue.append (r2_trxid); // Monto de pago svalue.append (R3_amt); // transacciones moneda svalue.append (r4_cur); // Nombre del producto svalue.append (R5_PID); // número de pedido comercial svalue.append (r6_order); // ID de miembro de pago de Yibao svalue.append (R7_UID); // Información de extensión de comerciante svalue.append (R8_MP); // Tipo de retorno de resultado de la transacción svalue.append (r9_btype); String snewstring = paymentUtil.hmacSign (svalue.ToString (), keyValue); return snewstring.equals (HMAC); } / ** * @param avalue * @param akey * @return * / public static string hmacSign (string avalue, string akey) {byte k_ipad [] = new byte [64]; byte k_opad [] = nuevo byte [64]; byte keyb []; valor de byte []; intente {keyB = akey.getBytes (EncodingCharset); valor = avalue.getBytes (EncodingCharset); } catch (UnsupportedEncodingException e) {keyB = akey.getBytes (); valor = avalue.getBytes (); } Arrays.fill (k_ipad, keyb.length, 64, (byte) 54); Arrays.fill (k_opad, keyb.length, 64, (byte) 92); for (int i = 0; i <keyb.length; i ++) {k_ipad [i] = (byte) (keyb [i] ^ 0x36); k_opad [i] = (byte) (keyb [i] ^ 0x5c); } MessageDigest md = null; intente {md = messageDigest.getInstance ("md5"); } catch (nosuchalgorithMexception e) {return null; } md.update (k_ipad); md.update (valor); byte dg [] = md.digest (); md.reset (); md.update (k_opad); md.update (DG, 0, 16); dg = md.digest (); return toHex (dg); } public static string toHex (byte input []) {if (input == null) return null; StringBuffer output = new StringBuffer (input.length * 2); for (int i = 0; i <input.length; i ++) {int current = input [i] & 0xff; if (corriente <16) output.append ("0"); output.append (Integer.ToString (actual, 16)); } return output.ToString (); } / ** * * @param args * @param key * @return * / public static string gethmac (string [] args, clave de cadena) {if (args == null || args.length == 0) {return (null); } StringBuffer str = new StringBuffer (); para (int i = 0; i <args.length; i ++) {str.append (args [i]); } return (HMACSign (str.ToString (), key)); } / ** * @param avalue * @return * / public static string digest (string avalue) {avalue = avalue.trim (); valor de byte []; intente {value = avalue.getBytes (EncodingCharset); } catch (UnsupportedEncodingException e) {value = avalue.getBytes (); } MessageDigest md = null; intente {md = messageDigest.getInstance ("sha"); } Catch (nosuchalgorithMexception e) {E.PrintStackTrace (); regresar nulo; } return toHex (md.digest (valor)); } // public static void main (string [] args) {// System.out.println (HMACSIGN ("Annulcard1000043252120080620160450.0http: //localhost/szxpro/callback.asp 海? 4? 564868265473632445648682654736324511 "," 8upp0ke8sq73zvp370vko7c39403rtk1ywx40td6irh216036h27eb12792t "); // }}Devolución de llamada de Yibao
Peer-to-peer: Yibao accede directamente al comercio electrónico, aquí no hay cliente.
¡Este método es un uso obligatorio, y no podemos recibirlo de esta manera! Porque no tenemos una IP fija
Yibao tiene un mecanismo de reenvío. Si lo visita y no lo envía de vuelta el mensaje, ¡seguirá resurgiendo!
¡El comercio electrónico necesita devolver una cadena que comienza con el éxito!
Guíe al navegador del cliente para redirigir al comercio electrónico. ¡Es para que los clientes accedan al comercio electrónico!
No se puede usar!
HMAC: 13 Valor de parámetros + KeyValue (Key) + Algoritmo (MD5)
13 Valor de parámetros: ¡Establezca usted mismo!
KeyValue: ¡El que Yibao nos envió después de registrarnos, solo nosotros y Yibao sabíamos sobre esta cosa!
El algoritmo con el MD5 subyacente: PaymentUtil.BuildHMAC (14), que devuelve HMAC
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.