En la sección anterior, hemos realizado la visualización de la página de pago. Desde el código JSP que se muestra en la sección anterior, podemos ver que cuando el usuario haga clic para confirmar el pago, saltará a la acción de $ {shop} /pay_gobank.action . Es decir, después de enviar, tenemos que procesar alguna lógica en el método Gobank en la Acción de pago (es decir, la lógica del diagrama de flujo en la demostración de la Sección 21), es decir, obtener el texto sin formato, cifre el texto sin formato en una firma (cifrado) y luego visite el servidor Yibao, Yibao conecta al banco para completar el pago.
Sin embargo, teniendo en cuenta el patrón de diseño MVC, colocaremos la lógica comercial anterior en la capa de servicio para su procesamiento, por lo que implementemos la lógica de pago de la demostración en la Sección 21.
1. Escribe un modelo para encapsular los parámetros
En primer lugar, necesitamos escribir un modelo (SendData) para recibir los parámetros transmitidos desde la página JSP y agregar otros parámetros que deben ser enviados por nosotros mismos. Estos parámetros se estipulan en los documentos oficiales de Yibao. Podemos seguir estrictamente las regulaciones en los documentos:
/ * * La información enviada por el centro comercial a Yibao El pago se encapsula como una entidad * */clase pública SendData implementa serializable {private estático final de serie Long SerialUdUid = -6304103739907145812l; // (*) indica la cadena privada del campo requerido p0_cmd; // tipo de negocio (*), fijo como: comprar cadena privada p1_merid; // comerciante número (*) cadena privada p2_order; // Número de orden de comerciante Cadena privada P3_amt; // Cantidad de pago Cadena privada P4_CUR; // Trading Moneda (*) String privado P5_PID;/Nombre del producto Nombre de producto P6_pcat; // Tipo de producto Tipo privado P7_PDesc. p8_url; // Dirección para que los comerciantes reciban datos de éxito de pago Cadena privada P9_SAF; // Dirección de entrega Cadena privada pa_mp; // Información de extensión de comerciante cadena privada PD_FRPID; // Codificación de canal de pago, es decir, cadena privada bancaria pr_needResponse; // Mecanismo de respuesta // omitir los métodos de obtención y establecer}Los atributos anteriores son todos los parámetros que se transmitirán a Yibao. Puede elegir los parámetros que necesita. No todos se transmiten. Dependiendo de la situación, generalmente los pasamos excepto P5, P6 y P7. Echemos un vistazo al código de acción:
2. Implementación de la acción salarial
En Afaction, encapsulamos principalmente algunos parámetros pasados en la página JSP al modelo, y luego llamamos al método de la capa de servicio para inicializar otros parámetros, de la siguiente manera:
@Controller ("PayAction")@Scope ("Prototype") Public Class PayAction extiende Baseaction <ject> Implementa ParameteraSAWare {public String GoBank () {// 1. Parámetros completos: P2 P3 PD PA, debe obtener Forder Forder = (Forder) Session.get ("Oldforder"); Usuario user = (usuario) session.get ("usuario"); model.setp2_order (Forder.getID (). ToString ()); // Número de orden comercial Model.setp3_amt (Forder.gettotal (). ToString ()); // Cantidad de pago modelo.setpa_mp (user.getEmail () + "," + user.getphone ()); // Información de extensión comercial // 2. Agregar parámetros // 3. Cifrar y obtener firma // 4. Almacenar en el dominio de solicitud a payservice.savedatatorequest (solicitud, modelo); // 2,3,4 La lógica comercial se entrega a la capa de servicio para su procesamiento/5. Saltar a la página de pago de la página "Pagar"; }}A continuación, escribamos el código de la capa de servicio. La capa de servicio implementa principalmente la lógica de los pasos anteriores 2, 3 y 4:
3. Implementación de la capa de servicio
El código específico es el siguiente:
// Interfaz PayService Interface Public PayService {// Almacenamiento La información cifrada en el mapa de resumen público de requestmap <string, object> saveDAtatorequest (map <string, object> request, sendData sendData); // cifre los datos devueltos para obtener el texto cifrado y compararlos con el texto de cifrado enviado (lo implementaremos más tarde) public boolean checkbackData (backdata backdata);} // payServiceImple Clase @service ("payService") public class PayServiceImpl implements PayService {// Key @Value ("" "PayService") public class PayServicePlplempl implements PayService {// Key @Value ("" "" PayService ") Public Class Clase PayServiceplempl implements PayService {// Key @Value (" "" ")") ") llave; @Value ("#{prop.p1_merid}") // cuenta mer (no número de pedido) cadena privada p1_merid; // La dirección de devolución para el pago exitoso @Value ("#{prop.p8_url}") String private p8_url; // Los tres atributos anteriores son todos valores fijos, los pongo en el archivo de configuración Pay.Properties, y uso directamente la anotación de Spring @Value para obtener // completar los datos de SendData, P2 P3 PD PA es una inyección de front-end, y no hay necesidad de llenarlo aquí. Ya he obtenido sendData privado de envío de senddata (sendData sendData) {sendData.setp0_cmd ("comprar"); sendData.setp1_merid (p1_merid); sendData.setp4_cur ("CNY"); sendData.setp5_pid (""); sendData.setp6_pcat (""); sendData.setp7_pdesc (""); sendData.setp8_url (p8_url); sendData.setp9_saf ("0"); sendData.setPr_NeedResponse ("0"); devolver sendData; } // Complete la adición de datos y devuelve la cadena privada de texto de formación adjunta JuneEndDataparam (sendData sendData) {// Todos los datos se llenan sendData = this.finishsendData (sendData); StringBuffer Infobuffer = new StringBuffer (); infoBuffer.append (sendData.getp0_cmd ()); infoBuffer.append (sendData.getp1_merid ()); infoBuffer.append (sendData.getp2_order ()); infoBuffer.append (sendData.getp3_amt ()); infoBuffer.append (sendData.getp4_cur ()); infoBuffer.append (sendData.getp5_pid ()); infoBuffer.append (sendData.getp6_pcat ()); infoBuffer.append (sendData.getp7_pdesc ()); infoBuffer.append (sendData.getp8_url ()); infoBuffer.append (sendData.getp9_saf ()); infoBuffer.append (sendData.getpa_mp ()); infoBuffer.append (sendData.getpd_frpid ()); infoBuffer.append (sendData.getpr_needResponse ()); return infoBuffer.ToString (); } // Almacene la información cifrada en el mapa público de requestmap @Override <string, object> saveDateRequest (map <string, object> request, sendData sendData) {// Devuelve la cadena para que se adhiera (es decir, context) String String JoinParam = JoinsendDataparam (SendData); request.put ("p0_cmd", sendData.getp0_cmd ()); request.put ("p1_merid", sendData.getp1_merid ()); request.put ("p2_order", sendData.getp2_order ()); request.put ("p3_amt", sendData.getp3_amt ()); request.put ("p4_cur", sendData.getp4_cur ()); request.put ("p5_pid", sendData.getp5_pid ()); request.put ("p6_pcat", sendData.getp6_pcat ()); request.put ("p7_pdesc", sendData.getp7_pdesc ()); request.put ("p8_url", sendData.getp8_url ()); request.put ("p9_saf", sendData.getp9_saf ()); request.put ("pa_mp", sendData.getpa_mp ()); request.put ("pd_frpid", sendData.getpd_frpid ()); request.put ("PR_NeedResponse", sendData.getPr_NeedResponse ()); request.put ("HMAC", DigestUtil.HMACSIGN (JoinParam, Key)); // Agregar firma (CIPHERTEXT) Solicitud de retorno; }}Podemos ver que el principio de implementación es en realidad el mismo que el servlet en la demostración anterior. El código anterior utiliza el archivo y anotaciones Pay.Properties. Echemos un vistazo a la configuración en el archivo pay.properties y frijoles.
#pay.propertieskey = w0p75wmz203fr46r5i70v556whfa94j14yw5j6vuh4yo3nrl5jsqf3c416777p1_merid = 10000940764p8_url = https/: //www.hao123.com
<
Bien, ahora que las capas de acción y servicio están escritas, configuremos el archivo Struts.xml nuevamente:
4. Struts.xml Configuración y pay.jsp Página
<Action Name = "Pay_*" Method = "{1}"> <resultado name = "Pay">/user/pay.jsp </resultado> </action>La configuración de Struts.xml es muy simple. Principalmente salta a la página user/pay.jsp de acuerdo con el valor de retorno y envía el texto sin formato (parámetros) y el texto cifrado (firma) establecido anteriormente en el servidor Yibao:
<div> <span>Order number: </span><strong>${requestScope.p2_Order }</strong><span>[Please remember this number so that you can use it when making payments and inquiries] </span> </div> <div> <span>Payment amount: </span><strong>¥${requestScope.p3_Amt }</strong> </div> <div> <span>Payment method: </span> <img src = "$ {shop} /files/yibao.jpg"/> </div> <div> <span> Banco de pagos: </span> <img src = "$ {shop}/files/bankimages/$ {pd_frpid} .gif"/> </div> <div> <div name = "yeepay" Action = 'https: //www.yeepay.com/app-merchant-proxy/node' método = 'post' target = "_ blank"> <input type = 'hidden' name = 'p0_cmd' valor = '$ {requestscope.p0_cmd}'> <input type = 'hidden' name = 'p1_merid' valor = '$ {requestscope.p1_merid}'> <input type = 'Hidden' name = 'p2_order' valor = '$ {requestscope.p2_order}'> <input type = 'hidden' name = 'p2_order' value = '$ {requestscope.p2_order}'> <input type = 'hidden' name = 'p3_amt' valor = '$ {requestscope.p3_amt}'> <input type = 'hidden' name = 'p4_cur' value = '$ {requestscope.p4_cur}'> <input type = 'hidden' name = 'p5_pid' value = '$ {requestscope.p5_pid}'> <input type = 'hidden' name = 'p6_pcat' valor = '$ {requestscope.p6_pcat}'> <input type = 'Hidden' name = 'p7_pdesc' value = '$ {requestscope.p7_pdesc}'> <input type = 'hidden' name = 'p8_url' value = '$ {requitscope.p8_url}'> <input type = 'hidden' name = 'p9_saf valor = '$ {requestscope.p9_saf}'> <input type = 'Hidden' name = 'pa_mp' value = '$ {requestscope.pa_mp}'> <input type = 'hidden' name = 'pd_frpid' value = '$ {requitscope.pd_frpid}'> <input type = "hiddden" name = "" "" proleguen " valor = "$ {requestscope.pr_needResponse}"> <input type = 'hidden' name = 'hmac' value = '$ {requestscope.hmac}'> <div> <input type = "subt" value = "pay ahora"/> </div> </form> </div> </div> Pay.jsp enviará todo el texto sin formato que queremos pasar y el texto de cifrado correspondiente al servidor Yibao. Yibao lo encriptará en el texto de cifrado de la misma manera en función de estos textos planos, y luego lo coincidirá con el texto de cifrado que hemos transmitido. Si lo mismo significa que los datos son seguros, no se manipulan durante el proceso de transmisión, y salta a la página de pago normalmente y luego realiza un pago normal; Si no es lo mismo, el pago no está permitido y aparece una página de inmediato amigable.
En este punto, ya he dejado en claro este proceso de pago en línea. La razón es muy simple. No es más que agregar parámetros para formarlos, agregar una contraseña para generar un texto cifrado y luego enviar estos parámetros y texto cifrado a un tercero. También agrega una contraseña en el mismo método de cifrado y la compara con lo que le envié. En cuanto a cómo llamar a la interfaz bancaria, no es lo que tenemos que hacer. Esta es responsabilidad del tercero, incluidas algunas cosas de seguridad. Todos pueden centrarse en sus propios asuntos: solo necesito conectarme con el tercero y transmitirle información útil a él; El tercero solo necesita centrarse en cómo conectarse con diferentes bancos, lo que aporta una gran comodidad al desarrollo. Porque las interfaces conectadas con diferentes bancos son definitivamente diferentes. Si vamos directamente a conectarnos con los bancos, el costo es demasiado alto y es inconveniente de mantener. Si el banco se actualiza, tengo que actualizarlos también ... con un tercero, nunca tendremos que preocuparnos por eso. La actualización es una cuestión de un tercero, y nuestra interfaz con un tercero no cambiará ~
Enlace original: http://blog.csdn.net/eson_15/article/details/51464415
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.