Na seção anterior, fizemos a exibição da página de pagamento. A partir do código JSP exibido na seção anterior, podemos ver que, quando o usuário clicar para confirmar o pagamento, ele aumentará a ação de $ {shop} /pay_gobank.action . Ou seja, após o envio, precisamos processar alguma lógica no método Gobank no PayAction (ou seja, a lógica do fluxograma na demonstração da Seção 21), ou seja, obtenha o texto sem formatação, criptografar o texto simples em uma assinatura (texte cifra) e visite o servidor Yibao, o Yibao se conecta ao banco para concluir o banco.
No entanto, considerando o padrão de design do MVC, colocaremos a lógica de negócios acima na camada de serviço para processamento, então vamos implementar a lógica de pagamento da demonstração na Seção 21.
1. Escreva um modelo para encapsular parâmetros
Primeiro de tudo, precisamos escrever um modelo (sendData) para receber os parâmetros transmitidos na página JSP e adicionar outros parâmetros que precisam ser enviados por nós mesmos. Esses parâmetros são estipulados nos documentos oficiais de Yibao. Podemos seguir estritamente os regulamentos nos documentos:
/ * * As informações enviadas pelo shopping para o pagamento de Yibao são encapsuladas como uma entidade * */classe pública sendData implementa serializável {private estático final serialversionuid = -6304103739907145812l; // (*) indica a sequência privada de campo necessária P0_CMD; // Tipo de negócios (*), corrigido como: comprar string privada p1_merid; // Número do comerciante (*) Private String p2_order; // Número do pedido do comerciante String privada p3_amt; // Valor do pagamento Private String p4_cur; // moeda de negociação (*) private string p5_pid; // name de produto private P6_p; P8_URL; // Endereço para os comerciantes receberem dados do pagamento Dados de dados privada string privada p9_saf; // Endereço de entrega String privada string pa_mp; // Informações de extensão do comerciante String privada string pd_frpid; // codificação do canal de pagamento, ou seja, string privada prateada pr_needResponse; // mecanismo de resposta // omitir e definir métodos}Os atributos acima são todos parâmetros a serem transmitidos para Yibao. Você pode escolher os parâmetros necessários. Nem todos eles são transmitidos. Dependendo da situação, geralmente os passamos, exceto P5, P6 e P7. Vamos dar uma olhada no Código de Ação:
2. Implementação do PayAction
No PayAction, encapsulamos principalmente alguns parâmetros passados na página JSP no modelo e, em seguida, chamamos o método da camada de serviço para inicializar outros parâmetros, como segue:
@Controller ("PayAction")@Scope ("Prototype") public class PayAction estende o Baseaction <ject> implementa o parameterAware {public String gobank () {// 1. Parâmetros completos: P2 P3 PD PA, você precisa obter mais forder = (FORDER) session.get ("Oldforder"); Usuário do usuário = (Usuário) session.get ("Usuário"); model.setp2_order (forder.getId (). tostring ()); // Número de ordem do comerciante Model.setp3_amt (forder.gettotal (). Tostring ()); // Valor do pagamento Model.setpa_mp (user.getEmail () + "," + user.getphone ()); // Informações de extensão do comerciante // 2. Anexar parâmetros // 3. Criptografar e obter assinatura // 4. Armazene no domínio da solicitação para PayService.SAVEDATATOREQUEST (solicitação, modelo); // 2,3,4 A lógica de negócios é entregue à camada de serviço para processamento // 5. Pule para a página de pagamento devolver "pagamento"; }}Em seguida, vamos escrever o código da camada de serviço. A camada de serviço implementa principalmente a lógica das etapas acima 2, 3 e 4:
3. Implementação da camada de serviço
O código específico é o seguinte:
// interface interface PayService Public Interface PayService {// Armazene as informações criptografadas no mapa abstrato de requestmap public <string, object> savedAtatatoreQuest (map <string, object> request, sendData sendData); // criptografar os dados retornados para obter o texto cifrado e compará -los com o CipherText de volta enviado (nós o implementaremos mais tarde) public boolean checkbackdata (backdata backdata);##ValServiceImpl implementation Class @Service (PayService ") PAYSTICEMPLEMPLEMPMENSPMENSPMENTS POSSPLEAÇÃO POSTENSPLEMPL) chave de string privada; @Value ("#{prop.p1_merid}") // mer conta (não número de pedido) private string p1_merid; // O endereço de retorno para pagamento bem -sucedido @Value ("#{prop.p8_url}") private string p8_url; // Os três atributos acima são todos valores fixos, eu os coloquei no arquivo de configuração do Pay.Properties e uso diretamente a anotação da primavera @value para obter // completar os dados do sendData, P2 P3 PD PA é uma injeção front-end e não há necessidade de preenchê-lo aqui. Eu já obtive o sendData privado FinalSendData (sendData sendData) {sendData.setp0_cmd ("compra"); 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"); retornar sendData; } // Preencha a adição de dados e retorne a string privada de texto simples anexada junção desenddataparam (sendData sendData) {// Todos os dados preenchidos 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 ()); retornar infobuffer.toString (); } // Armazene as informações criptografadas no requestmap @Override Public Map <String, Object> SavedAtATeQuest (map <string, object> request, sendData sendData) {// retorna a string a ser anexada (isto é, planytext) string junção = jonsenddataparam (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 (jun JunParam, chave); // Adicione a solicitação de retorno de assinatura (CipherText); }}Podemos ver que o princípio da implementação é realmente o mesmo que o servlet na demonstração anterior. O código acima usa o arquivo Pay.Properties e as anotações. Vamos dar uma olhada na configuração no arquivo pay.properties e beans.xml:
#pay.propertiesKey = w0p75wmz203fr46r5i70v556whfa94j14yw5j6vuh4yo3nrl5jsqf3c41677p1_merID = 10000940764p8_url = https/:/: //: //: //: //: //: //: //wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwsilic14..
<!-beans.xml-> <bean id = "prop"> <propriedade name = "locations"> <Array> <Value> ClassPath: public.properties </value> <!-之前用到的-> <Value> ClassPath: pay.properties </value> </ration> </propriedade> </ Bean>
Ok, agora que as camadas de ação e serviço estão escritas, vamos configurar o arquivo struts.xml novamente:
4.
<ação name = "pay_*" method = "{1}"> <name de resultado = "pay">/user/pay.jsp </resultado> </action>A configuração do Struts.xml é muito simples. Ele salta principalmente para a página do usuário/pay.jsp de acordo com o valor de retorno e envia o texto simples (parâmetros) e o CipherText (assinatura) definido acima para o servidor Yibao:
<div> <pan> Número do pedido: </span> <strong> $ {requestscope.p2_order} </strong> </span> [Lembre -se desse número para que você possa usá -lo ao fazer pagamentos e consultas] </span> </div> <div> <dran> Valor do pagamento: </strong> ¥ ¥ $ {SolicpOp.pro_amt} </span> <img src = "$ {shop} /files/yibao.jpg"/> </div> <div> <span> Banco de pagamento: </span> <img src = "$ {shop}/files/BankImages/$ {pd_frpid} .gif"/> </div> <siv> <storm> <storm> <storm-> <storm-> <storm> <storm/BankImages/$ {pd_frpid} .gif "/> </div> Action = 'https: //www.yeepay.com/app-merchant-proxy/node' method = 'post' target = "_ em branco"> <input type = 'hidden' name = 'p0_cmd' value = '$ {requestscope.p0_cmd}'> <input ' value = '$ {requestscope.p1_merId}'> <input type = 'Hidden' name = 'p2_order' value = '$ {requestscope.p2_order}'> <input type = 'hidden' name = 'p2_order' value = '$ {requestscope.p2_order' <input = 'types' hidden = '$ {requestsCope.p2_order' <input = ' value = '$ {requestscope.p3_amt}'> <input type = 'hidden' name = 'p4_cur' value = '$ {requestscope.p4_cur}'> <input type = 'hinded' name = 'p5_pid' value = '$ {requestsCope.p5_pid' '> <spid type' type = '$ {requestsCope.p5_pid' '> <spi) value = '$ {requestscope.p6_pcat}'> <input type = 'hidden' name = 'p7_pdesc' value = '$ {requestscope.p7_pdesc}'> <input type = 'hidden' name = 'p8_url' = '{' {SOLDSCOPE.P8_URL} value = '$ {requestscope.p9_saf}'> <input type = 'hidden' name = 'pa_mp' value = '$ {requestscope.pa_mp}'> <input type = 'hinco' name = 'pd_frpid' value = '$ {{somescope.pd_frpid}'> value = "$ {requestscope.pr_needResponse}"> <type de entrada = 'hidden' name = 'hmac' value = '$ {requestscope.hmac}'> <div> <input type = "submit" value = "pague agora"/> </div> </form> </div> </div> Pay.jsp enviará todo o texto simples que queremos passar e o texto cifra correspondente ao Yibao Server. Yibao o criptografará no texto da cifra da mesma maneira com base nesses textos simples e o combinará com o texto da cifra que transmitimos. Se o mesmo significa que os dados são seguros, eles não são adulterados durante o processo de transmissão e pule para a página de pagamento normalmente e, em seguida, faça um pagamento normal; Se não for o mesmo, o pagamento não é permitido e uma página de prompt amigável aparece.
Neste ponto, eu já deixei claro sobre esse processo de pagamento on -line. O motivo é muito simples. Não é nada mais do que adicionar parâmetros para formá -los, adicionando uma senha para gerar um texto cifrado e enviar esses parâmetros e texto cifrado para terceiros. Ele também adiciona uma senha no mesmo método de criptografia e a compara com o que eu a enviei. Quanto a como chamar a interface bancária, não é o que temos que fazer. Esta é a responsabilidade do terceiro, incluindo algumas coisas de segurança. Todos podem se concentrar em seus próprios assuntos: eu só preciso me conectar com o terceiro e transmitir informações úteis para ele; O terceiro precisa apenas se concentrar em como se conectar com diferentes bancos, o que traz grande conveniência ao desenvolvimento. Porque as interfaces conectadas a diferentes bancos são definitivamente diferentes. Se formos diretamente nos conectar com os bancos, o custo é muito alto e é inconveniente de manter. Se o banco atualizar, eu também tenho que atualizá -los ... com terceiros, nunca teremos que nos preocupar com isso. A atualização é uma questão de terceiros, e nossa interface com terceiros não mudará ~
Link original: http://blog.csdn.net/eson_15/article/details/51464415
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.