Nesta seção, primeiro escreveremos uma demonstração simples para testar o processo de pagamento de Yibao. Depois de se familiarizar com esse processo, faremos o desenvolvimento real. Por ser uma demonstração, não considerei alguns padrões de design, mas apenas implementam diretamente a função de pagamento. Para implementar funções de pagamento, o Yibao exige que a API forneça a nós. Portanto, a questão é que a coisa mais importante ao usar uma plataforma de pagamento de terceiros é obter a API da plataforma. Primeiro, devemos obter seus documentos de API e desenvolvimento e, em seguida, podemos fazer um desenvolvimento adicional.
1. Obtenha a API de Yibao
O primeiro passo para obter a API é registrar uma conta no Yibao. Esta conta é a conta do comerciante. Depois que o comprador paga, ele depositará o dinheiro na conta e o comerciante o retirará para o cartão bancário sozinho. Yibao cobrará uma certa taxa de manuseio durante o processo de retirada. Este é o modelo de lucro de Yibao. No entanto, o pré -requisito para o registro bem -sucedido é que você precisa ter um site, ou uma empresa, Bara, Bara, etc. De qualquer forma, você deve ser qualificado para se inscrever. Yibao revisará este ponto. Somente quando você o encontrar, permitirá que você se registre e forneça a interface deles. Nem todo mundo pode se registrar. Eu o usei e outros registrados, mas eu não tinha nada ... Não consegui me registrar ... eu sei disso, mas geralmente quando se desenvolveu em uma empresa, não haveria esse problema. Deve haver uma conta. O mais importante é dominar o processo de desenvolvimento e as tecnologias relacionadas.
2. Teste o processo de pagamento
Com a API oficial e os documentos técnicos, você pode começar a se desenvolver. Aqui, escrevemos principalmente uma demonstração simples para testar o processo de pagamento de Yibao. A estrutura da demonstração é muito simples, um servlet, um filtro, duas páginas JSP e uma classe de ferramentas criptografada. O Servlet lida com o lado do servidor Yibao. Fazemos algum processamento relacionado à interface Yibao. O filtro é usado para lidar com possíveis problemas chineses. Um dos dois JSP é a página front-end.
Vamos primeiro analisar o processo de solicitação de pagamento, conforme mostrado abaixo:
OK, vamos analisar o código relevante na demonstração em detalhes:
2.1 Página de teste da recepção
Primeiro, vamos dar uma olhada no código específico da página da recepção index.jsp
<%@ Page Language = "Java" PageEncoding = "Utf-8"%> <! Doctype html public "-// W3C // DTD HTML 4.01 Transição // EN"> <Html> <head> <title> Front Office Home </title> </Head> <Form> <H1> Online Demo Action = "$ {PageContext.Request.ContextPath}/servlet/payServlet" Method = "post"> O número do pedido para este compras <input type = "text" name = "p2_order"/> <br> Money <briny type = "text" name = "p3_amt" = "0,01"/> <brin) name = "pd_frpid"> Banco de construção <input type = "radio" value = "ccb-net" name = "pd_frpid"> <br> <input type = "submit" value = "submit"/> <input type = "hidden" value = "page" = "name" "/> </form> </body> </Na página JSP acima, podemos ver que os valores do atributo de nome nessas tags de entrada são muito estranhos, pi_function (i = 0,1,2,…, 9) e, é claro, tenho outros valores. Isso requer referência ao documento oficial de Yibao. Esses nomes representam atributos correspondentes e serão passados para o sevlet para processamento. Em relação a esses valores de atributo, tenho uma imagem da seguinte maneira:
Alguns desses nomes de parâmetros são transmitidos a partir da recepção em projetos reais, como o número do pedido escrito acima, quanto custa pagar, e estes serão assumidos quando o pedido for confirmado. Se outros parâmetros forem necessários, eles precisam ser especificados no servlet. Se os campos não forem necessários, eles podem estar vazios. O vazio aqui não é nulo, mas "", que será mencionado no servlet mais tarde.
Vamos dar uma olhada nos valores de valor correspondentes nos dois bancos. Yibao fornecerá os valores de valor de todos os bancos que ele suporta. Estes são fixos e não podem ser modificados. Aqui estão dois bancos para testar o efeito.
O último campo oculto é usado para fazer um julgamento no servlet. Seja um pagamento ou uma devolução após o sucesso do pagamento, ele será explicado no sevlet abaixo.
2.2 Servlet lida com solicitações
O servlet lida principalmente por solicitações relacionadas a Yibao. Existem duas partes do conteúdo. Uma parte é enviar texto simples e cifra para Yibao, e a outra parte é julgar o texto simples e o texto da cifra enviado por Yibao. Vamos dar uma olhada no código de implementação específico na demonstração:
classe pública PayServlet estende httpServlet {public void Doget (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {string status = request.getParameter ("status"); if (status.equals ("pay")) {// O campo oculto no index.jsp é pago, portanto a peça de pagamento é processada // A chave de criptografia é usada no algoritmo de criptografia e fornecida pelo intermediário de pagamento. Cada comerciante possui um string exclusivo keyvalue = "w0p75wmz203fr46r5i70v556whfa94j14yw5j6vuh4yo3nrl5jsqf3c41677"; // 1: Atribua valores aos parâmetros. Esses parâmetros (ou seja, texto simples) são definidos no documento fornecido por Yibao. Não podemos alterar o nome String p0_cmd = formatString ("compra"); String p1_merid = formatString ("10000940764"); String p2_order = formatString (request.getParameter ("p2_order")); String p3_amt = formatString (request.getParameter ("p3_amt")); String p4_cur = formatString ("cny"); String p5_pid = ""; String p6_pcat = ""; String p7_pdesc = ""; String p8_url = "http://www.tonngji.edu.cn"; // Esta é a página para a qual você pular após o pagamento for bem -sucedido. Você pode defini -lo como a página inicial do shopping. Esta demonstração é suficiente para usar a página inicial da Universidade Tongji ... String p9_saf = "0"; String pa_mp = ""; String pd_frpid = formatString (request.getParameter ("pd_frpid")); PD_FRPID = PD_FRPID.TOUPPERCASE (); String pr_needResponse = "0"; String hmac = formatString (""); // HMAC é usado para armazenar o CipherText/*Todo o texto simples acima é embrulhado com o método do formatString. The method is below, mainly converting null to "" *Because null cannot be converted into ciphertext*// Solve data security issues: Encrypt the plaintext ---> ciphertext and then hand over both the plaintext and the ciphertext to Yibao// After Yibao gets the data, encrypt the transmitted plaintext and compare it with the transmitted ciphertext, // If the equal data has not been adulterado com (o comerciante e o yibao usam a mesma chave ao criptografar) // anexar dados de texto simples ao stringbuffer, observe que a ordem de anexar não pode ser alterada; caso contrário, o cifra gerado será diferente. // Você deve escrever estritamente de acordo com o nome do documento oficial de Yibao, porque Yibao é adicionado de acordo com o pedido no documento. Infobuffer = new StringBuffer (); infobuffer.append (p0_cmd); infobuffer.append (p1_merID); infobuffer.append (p2_order); infobuffer.append (p3_amt); infobuffer.append (p4_cur); infobuffer.append (p5_pid); infobuffer.append (p6_pcat); infobuffer.append (p7_pdesc); infobuffer.append (p8_url); infobuffer.append (p9_saf); infobuffer.append (PA_MP); infobuffer.append (pd_frpid); infobuffer.append (pr_needResponse); // O CipherText criptografado é armazenado no HMAC, e o algoritmo de criptografia Yibao o fornecerá, porque também deve usar o mesmo algoritmo hmac = digestutil.hmacsign (infobuffer.toString (), keyvalue); // Armazene o texto simples e o texto cifra no request.setAttribute request.setAttribute ("p0_cmd", p0_cmd); request.setAttribute ("p1_merid", p1_merID); request.setAttribute ("p2_order", p2_order); request.setAttribute ("p3_amt", p3_amt); request.setAttribute ("p4_cur", p4_cur); request.setAttribute ("p5_pid", p5_pid); request.setAttribute ("p6_pcat", p6_pcat); request.setAttribute ("p7_pdesc", p7_pdesc); request.setAttribute ("p8_url", p8_url); request.setAttribute ("p9_saf", p9_saf); request.setAttribute ("PA_MP", PA_MP); request.setAttribute ("pd_frpid", pd_frpid); request.setAttribute ("pr_needResponse", pr_needResponse); request.setattribute ("hmac", hmac); System.out.println ("hmac->" + hmac); // SKIP para reqpay.jsp e envie essas informações para yibao request.getRequestDispatcher ("/reqpay.jsp"). Forward (solicitação, resposta); } else if (status.equals ("succcess")) {// o que vem do yibao é sucesso, processamento de retornos de verificação PrintWriter out = Response.getWriter (); String keyValue = "W0P75WMZ203FR46R5I70V556WHFA94J14YW5J6VUH4YO3NRL5JSQF3C41677"; // obtenha toda a string simples r0_cmd = formatString (request.getParameter ("r0_cmd")); String p1_merid = request.getParameter ("p1_merid"); String r1_code = formatString (request.getParameter ("r1_code")); String r2_trxid = formatString (request.getParameter ("r2_trxid")); String r3_amt = formatString (request.getParameter ("r3_amt")); String r4_cur = formatString (request.getParameter ("r4_cur")); String r5_pid = new String (formatString (request.getParameter ("r5_pid")). GetBytes ("ISO-8859-1"), "UTF-8"); String r6_order = formatString (request.getParameter ("r6_order")); String r7_uid = formatString (request.getParameter ("r7_uid")); String r8_mp = new String (formatString (request.getParameter ("r8_mp")). GetBytes ("ISO-8859-1"), "UTF-8"); String r9_btype = formatString (request.getParameter ("r9_btype")); // Anexe dados à String HMAC da PlenoText HMAC = FormatString (request.getParameter ("HMAC")); StringBuffer InfoBuffer = new StringBuffer (); infobuffer.append (p1_merID); infobuffer.append (r0_cmd); infobuffer.append (r1_code); infobuffer.append (r2_trxid); infobuffer.append (r3_amt); infobuffer.append (r4_cur); infobuffer.append (r5_pid); infobuffer.append (r6_order); infobuffer.append (r7_uid); infobuffer.append (r8_mp); infobuffer.append (r9_btype); // criptografar a string de texto simples retornado md5 = digestutil.hmacsign (infobuffer.toString (), keyvalue); // determinar se o texto cifrado criptografado é igual à assinatura de dados transmitida booleana isok = md5.equals (hmac); if (isok && r1_code.equals ("1")) {// r1_code é 1 para indicar sucesso // altere o status do pedido bem -sucedido para pago e exibir as informações de sucesso do pagamento para o usuário // ligue para a interface de serviço de email, sms de envio de sms, etc.//print aqui out.println ("Número de ordem" + r6_tern_r6); } else {out.println ("Fail !!!"); }}} public void DoPost (solicitação httpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {Doget (solicitação, resposta); } String formatString (text string) {if (text == null) {return ""; } retornar texto; }}2.3 Algoritmo de criptografia
O algoritmo de criptografia usado para converter texto simples em texto cifrado é fornecido por Yibao. Precisamos usá -lo apenas para converter texto simples em CipherText. O algoritmo é o seguinte:
classe pública Digestutil {private static string codingcharset = "utf-8"; public Static String Hmacsign (String Avalue, String AKEY) {BYTE K_IPAD [] = novo byte [64]; byte k_opad [] = novo byte [64]; byte keyb []; valor de byte []; tente {keyb = akey.getbytes (codingcharset); value = Avalue.getBytes (codingcharset); } 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; tente {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 (); retornar 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 (atual <16) saída.append ("0"); output.Append (Integer.ToString (Current, 16)); } return Output.ToString (); } public static string gethmac (string [] args, string key) {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 (), chave); } / ** * @param Avalue * @return * / public static string diger (string alvalue) {Avalue = Avalue.trim (); valor de byte []; tente {value = Avalue.getBytes (codingcharset); } Catch (UnsupportEdEncodingException e) {value = Avalue.getBytes (); } Messagedigest md = null; tente {md = Messagedigest.getInstance ("sha"); } catch (nosuchalgorithMexception e) {e.printStackTrace (); retornar nulo; } retornar tohex (md.digest (valor)); } // public static void main (string [] args) {// Parâmetro 1: PLAYTEXT (Dados a serem criptografados) Parâmetro 2: key System.out.println (Digestutil.hmacsign ("11111", "ABC"); System.out.println (digeril.hmacsign ("11111", "abd")); // Resolva problemas de segurança de dados: criptografar o texto simples ---> Texto secreto e o texto simples para Yibao // Depois que Yibao obtém os dados, criptografar o texto simples transmitido e compará-lo com o texto cifrado transmitido. Se os dados iguais não foram adulterados (o comerciante e Yibao usam a mesma chave ao criptografar)}}Não estudei muito o algoritmo de criptografia. Parece ser o algoritmo de criptografia MD5 de segunda geração. De qualquer forma, basta jogar o texto simples e ele definitivamente será criptografado em um texto cifrado. Vamos dar uma olhada na página reqpay.jsp:
<%@página linguagem = "java" contentType = "text/html; charset = gbk"%> <html> <head> <titter> para yeepay página </ititle> </ad head> <body> <form = "yeepay" action = 'https: //www.yeeyey.com/app-merchant- "Ação" type = 'Hidden' name = 'p0_cmd' value = '$ {requestscope.p0_cmd}'> <input type = 'hidden' name = 'p1_merid' value = '$ {requestscope.p1_merid}'> <input Type = 'hidden' name = 'P2_Order' ' type = 'Hidden' name = 'p3_amt' value = '$ {requestscope.p3_amt}'> <time de entrada = 'hidden' name = 'p4_cur' value = '$ {requestscope.p4_cur}'> <input Type = 'hidden' name = 'p3} » name = 'p6_pcat' value = '$ {requestscope.p6_pcat}'> <tipo de entrada = 'hidden' name = 'p7_pdesc' value = '$ {requestscope.p7_pdesc}'> <input Type = 'hidden' name = 'p8_url') name = 'p9_saf' value = '$ {requestscope.p9_saf}'> <tipo de entrada = 'hidden' name = 'pa_mp' value = '$ {requestscope.pa_mp}'> <input type = 'hidden' name = 'pa_mp' = '`{request.pa_pa_mpa_mp =' hidden 'name =' pa_mp '='` {scopspa_pa_mpa_mpA_MP = 'hidden' name = 'pa_mp' = '`{scopspa_pa_mpa_mpa_mpA =' hidden 'name =' pa_mp '='` `{scoping.pa_mpa_mpa_mpA_MP = 'hidden' 'name =') value = '$ {requestscope.pa_mp}'> <input type = 'hidden' name = 'pd_frpid' value = '$ {requestscope.pd_frpid}'> <input type = "hidden" name = "pr_needropSonse" = "$ {request.ProntsleSponsensensonsensensonst}" value = '$ {requestscope.hmac}'> <input type = 'submit'/> </morm> </body> </html> De fato, esta página é muito simples. É passar o texto simples e o texto cifra para Yibao através do formulário <form> . O URL de recebimento de Yibao é https://www.yeepay.com/app-merchant-proxy/node . Isso também é fornecido pelo Yibao Office, e podemos escrever este. De fato, existe apenas um botão submit . Clique no botão submit para enviar o texto simples e o texto cifra. Vamos dar uma olhada nos resultados dos testes:
3. Resultados do pagamento do teste
Teste simples de teste de teste index.jsp ~~~:
Depois de enviar, você irá para Reqpay e JSP. O efeito depois de clicar no botão Enviar é o seguinte. Testaremos o ICBC e o CCB:
Não há problema com o processo de pagamento. Originalmente, planejei pagar 1 centavo ao ICBC para ver os resultados após a conclusão do pagamento, mas descobri que o U-Shield expirou porque é mais conveniente usar o Alipay agora ... Não atualizei o u-shield, mas abri o e-payment por meio do ICBC, para que eu também possa usar o e-pay na interface acima, por assim pagar um centavo generoso ~
Em seguida, ele saltará para a página que especificamos antes, ou seja, Universidade Tongji ... Ok, o teste está concluído e todo o processo de pagamento acabou!
Esta seção testa principalmente uma demonstração simples para ver se pode ser conectado à interface de pagamento do banco. Agora, o teste está bem, ele foi conectado e você pode pagar como sempre mais tarde. Vamos apresentar a demonstração simples. Em seguida, continuaremos a desenvolver o módulo de pagamento on -line do nosso projeto anterior do Online Mall.
Endereço original: http://blog.csdn.net/eson_15/article/details/51447492
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.