1. Visão geral do pagamento on -line
O que é pagamento online? É isso mesmo, está apenas gastando dinheiro online! Todos devem ter tido essa experiência. Mas você pode não saber muito sobre a "história interna" do pagamento on -line, vamos aprender sobre isso abaixo!
Se você começar a executar um site de comércio eletrônico agora, os usuários devem pagar se comprarem algo. Seu site deve ser capaz de se conectar aos principais bancos. Então, após a conclusão do pagamento, retorne ao seu site para exibir o "sucesso do pagamento"!
É isso que faremos hoje, conecte -se ao sistema bancário on -line do banco para concluir os pagamentos. Para ser mais profissional, chamamos de "desenvolver um porta de entrada para pagamentos on -line"
2. Duas maneiras de pagar online
Existem duas maneiras de pagar online:
*O comércio eletrônico se conecta diretamente com os bancos
*O comércio eletrônico se conecta com bancos através de plataformas de pagamento de terceiros
O comércio eletrônico se conecta diretamente com os bancos, o que requer o consentimento do banco, mas, infelizmente, os bancos são muito "incríveis" e não qualquer um que queira se conectar com eles. Se o seu negócio de comércio eletrônico tiver um grande fluxo de capital diário, o banco se conectará com você porque todo o dinheiro pago pelo cliente ao comércio eletrônico será depositado na conta bancária! Mas se o fluxo de capital for pequeno, o banco não prestará atenção a você!
Quando os pequenos sites são insuficientes em fundos e não podem se conectar com os bancos, eles optam por cooperar com empresas de pagamento de terceiros. Todo mundo também entende o que são as empresas, como Alipay, Yibao, Fortune, Kuaiqian e outras empresas, são relativamente famosas na China. Essas empresas podem se conectar com os bancos (porque têm fundos suficientes) e, em seguida, pequenas empresas de comércio eletrônico podem se conectar com elas! Mas terceiros exigem uma taxa! Terceiros geralmente cobram 1% das taxas de comércio eletrônico, mas não cobram dinheiro dos clientes.
Através da imagem acima, você pode aprender que o nome do shopping, o número do pedido RMB e o tempo do pedido serão exibidos na página do banco. . . , como os bancos sabem sobre essas coisas? Obviamente, é repassado aos bancos por comércio eletrônico. Depois que a empresa de comércio eletrônico se conecta ao banco, a empresa de comércio eletrônico precisa passar os parâmetros exigidos pela página bancária para a página bancária, para que a página bancária possa exibir esses dados!
No entanto, nosso shopping não pode apenas se conectar a um banco! Devemos nos conectar com as quatro empresas do BOC, CCB, ABC e ICBC! Os parâmetros de ancoragem exigidos por diferentes bancos são diferentes, o que significa que precisamos escrever diferentes códigos de encaixe para diferentes bancos durante o desenvolvimento. Esta também é a desvantagem de se conectar diretamente com os bancos! Obviamente, a conexão direta com os bancos também é benéfica, ou seja, a segurança não é necessária, sem taxas de manuseio!
Desenvolver códigos diferentes para diferentes bancos (desvantagens);
Segurança (vantagens);
Nenhuma taxa de manuseio (vantagens);
Pequenos bancos de comércio eletrônico não permitem conexões (desvantagens).
Conforme mostrado na figura acima, após o clique do cliente para confirmar o pagamento no site do comércio eletrônico, ele será direcionado ao site de terceiros e, em seguida, o terceiro se conectará ao banco. Isso mostra que o comércio eletrônico precisa passar parâmetros para terceiros! O terceiro passa os parâmetros para o banco. A vantagem desse método é que ele só precisa ser desenvolvido para terceiros sem fornecer parâmetros para cada banco. É uma tarefa de terceiros fornecer parâmetros a cada banco. No entanto, se um terceiro não for antigo e confiável, se o terceiro for falido e as pessoas fogem, seu dinheiro desaparecerá. Como o dinheiro pago pelo cliente não vai para sua conta bancária, ele é pago à conta bancária de terceiros e você tem uma conta em terceiros. Além disso, terceiros também cobram uma taxa de manuseio, geralmente 1%, o que não é um número pequeno (é muito ruim).
3. Através de regras de pagamento online de terceiros
Se o comércio eletrônico quiser registrar um comerciante em terceiros, ele precisará fornecer a certificação ICP ao terceiro. Uma licença comercial da ICP é uma licença comercial do site que deve ser processada por um site comercial de acordo com as "medidas de gerenciamento da Internet" nacionais. Caso contrário, é ilegal operar.
Não podemos solicitar o ICP apenas por causa da prática! Portanto, não podemos registrar um comerciante em terceiros. No entanto, já temos comerciantes prontos registrados no Yibao, para que essa etapa possa ser ignorada.
Quando você se registra com sucesso em Yibao, Yibao lhe dará as seguintes coisas:
Abra uma conta em Yibao (ou seja, Código do Mercante): 10001126856
Especificação de acesso de Yibao: um algoritmo de criptografia simétrica CHM
Chave: 69Cl522AV6Q613II4W6U8K6XUW8VM1N6BFGYV769220IUYE9U37N4Y7RI4PL
Na especificação de acesso Yibao, podemos encontrar o gateway de pagamento de Yibao, que na verdade é um URL, um URL usado para se conectar com Yibao: https://www.yeepay.com/app-merchant-proxy/node
Na especificação de acesso Yibao, você também pode encontrar os parâmetros exigidos pelo YIBAO. Quando o comércio eletrônico se conecta ao Yibao, esses parâmetros precisam ser transmitidos para o gateway de pagamento:
Endereço de solicitação oficial: https://www.yeepay.com/app-merchant-proxy/node
Esses parâmetros precisam ser anexados ao URL.
No entanto, esteja ciente de que os valores desses parâmetros precisam ser criptografados. Tanto a chave de criptografia quanto o algoritmo de criptografia Yibao fornecerão!
onde p8_url indica a qual página retornar quando o pagamento for bem -sucedido. Isso significa que precisamos escrever uma página que exiba os resultados. Depois que o pagamento for bem -sucedido, um terceiro redirecionará para a página de devolução que especificamos e também nos trará alguns parâmetros. Nossa página precisa obter esses parâmetros e exibi -los na página. A seguir, estão os parâmetros devolvidos pelo terceiro:
4. Desenvolva um sistema de pagamento online de terceiros
etapa:
Página Index.jsp: Um formulário enviado ao BuSerServlet. Os itens do formulário incluem: número do pedido, valor do pagamento, seleção bancária
BuyServlet: Obtenha dados do formulário e prepare-se para conectar-se a um gateway de terceiros. Como apenas 3 parâmetros são fornecidos na página Index.jsp, e existem muitos parâmetros exigidos por terceiros, os parâmetros não fornecidos pela página são complementados pelo BuyServlet. E os parâmetros também precisam ser criptografados, o que também precisa ser concluído no BuyServlet
BackServlet: Quando o usuário paga com sucesso, o terceiro será redirecionado para a página de retorno que especificamos. Usamos o BackServlet como a página de retorno, que é usada para receber parâmetros passados pelo terceiro e exibi -los na página.
Como já temos um negócio registrado em Yibao, não precisamos registrar um negócio sozinho. Então, aqui está o uso do Yibao como uma plataforma de pagamento de terceiros para testes. Como não tenho comércio eletrônico (comércio eletrônico que deve aprovar a certificação ICP), também não posso registrar uma empresa com terceiros.
O negócio de Yibao que estamos usando agora é fornecido pelo Chuanzhi Podcast, uma empresa registrada pela Baba Sports Network no Yibao. Portanto, o dinheiro pago durante o teste foi dado à empresa registrada pela Baba Sports Network em Yibao.
Etapa 1: index.jsp
<Form Action = "" Method = "Post"> Número do pedido: <input type = "text" name = "p2_order"/> <br/> Valor: <input type = "text" name = "p3_amt"/> <br/> Selecione um banco: <input Type = "Radio" Name = "Pd_frpid" de "icb-Net-b-b2" "Nome =" Pd_frpid "=" icb-Net-b2 " src = "Bank_Img/icbc.bmp" align = "Middle"/> <input type = "Radio" name = "pd_frpid" value = "boc-net-b2c"/> Banco da China <img src = "Bank_img/icbc.bmp" align = "Middle"/> <input = "" value = "BOC-NET-B2C"/> Banco da China <img src = "Bank_Img/bc.bmp" align = "Middle"/> <br/> <input type = "Radio" name = "pd_frpid" value = "abc-net-b2c"/abrigo type="radio" name="pd_FrpId" value="CCB-NET-B2C"/> Construction Bank<img src="bank_img/ccb.bmp" align="middle"/><br/> <input type="radio" name="pd_FrpId" value="BOCO-NET-B2C"/>Bank of Communications<img src = "Bank_Img/bcc.bmp" align = "middle"/> <br/> <type de entrada = "submeter" value = "confirmar pagamento"/> </morm>
O valor correspondente de cada banco:
Etapa 2: buyServlet.java
public classe BuyServlet estende httpServlet {public void DoPost (solicitação HttPervletRequest, httpServletResponse resposta) lança servletexception, ioexception {request.setcharacterencoding ("utf-8"); Response.setContentType ("Texto/html; charset = utf-8"); String p0_cmd = "compra"; // tipo de negócio, o valor fixo é compra, ou seja, "compre" string p1_merid = "10001126856"; // o nome da empresa string p2_order = request.getParameter ("p2_order"); // número de string p3_amt =.getParameter ("p2_order"); "CNY"; // A moeda da transação, o valor fixo é CNY, indicando RMB String p5_pid = ""; // Nome do produto String p6_pcat = ""; // Nome do produto String p7_pdesc = ""; // Produto Descrição String p8_url = http: // localhost: 8080/compra/compra/"; "http: // localhost: 8080/buy/backservlet"; // a página de retorno do comércio eletrônico, quando o pagamento for bem-sucedido, o yibao será redirecionado para esta página string p9_saf = ""; // endereço de entrega PA_MP = "; // Informações de extensão do produto PD_FRPID =..GETPARMOTER ("; String pr_needResponse = "1"; // mecanismo de resposta, o valor fixo é 1 // chave, fornecida por Yibao, apenas comerciantes e yibao conhecem essa chave. String keyValue = "69Cl522AV6Q613II4W6U8K6XUW8VM1N6BFGYV769220IUYE9U37N4Y7RI4PL"; // Através dos parâmetros, teclas e algoritmos de criptografia acima, o valor HMAC é gerado // A ordem dos parâmetros é necessária. Se não houver valor, não poderá ser fornecido nulo, mas uma string vazia deve ser fornecida. String hmac = PaggetUtil.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, NNEEDR, P8_URL, // conecta todos os parâmetros ao endereço do gateway string url = "https://www.yeepay.com/app-merchant-proxy/node"; url + = "? p6_pcat + "& p7_pdesc =" + p7_pdesc = " + p7_pdesc +" & p8_url = " + p8_url =" + p8_url + "& p9_saf =" + p9_saf + "& pa_mp =" + pa_mp + "& pd_fring pr_needResponse + "& hmac =" + hmac; System.out.println (URL); // redirecionar para o gateway Respons.sendRedirect (URL); }}Etapa 3: BackServlet
public class BackServlet estende o httpServlet {public void Doget (solicitação HttpServletRequest, httpServletResponse resposta) lança servletexception, ioexception {Response.setContentType ("text/html; charset = utf-8"); / * * Yibao fornecerá uma série de parâmetros de resultado, podemos obter o que precisamos nele * obter o resultado do pagamento: R1_Code, 1 significa que o pagamento é bem -sucedido. * Obtenha o valor do pagamento: R3_AMT * Obtenha o número do pedido de comércio eletrônico: R6_Order * Obtenha o RECUTO DE RESULTADO TIPO: R9_BTYPE, 1 significa Redirecionar Retorno, 2 significa retorno ponto a ponto *, mas não podemos receber ponto a ponto, porque nossos IPs são todos os IPs LAN. */ String r1_code = request.getParameter ("r1_code"); String r3_amt = request.getParameter ("r3_amt"); String r6_order = request.getParameter ("r6_order"); String r9_btype = request.getParameter ("r9_btype"); if (r1_code.equals ("1")) {if (r9_btype.equals ("1")) {Response.getWriter (). print ("<h1> pague com sucesso! "<br/>"); Response.getWriter (). print ("O número do pedido é:" + r6_order + "<br/>"); }}}}Ferramentas para obter o HMAC fornecido pelo pagamento de Yibao
classe pública PaggentUtil {private static string codingcharset = "utf-8"; /*** Gere Método HMAC** @param p0_cmd Tipo de negócios* @param p1_merid Número do comerciante* @param p2_order Número do pedido do comerciante* @param p3_amt Valor do produto* @param p4_cur moeda de transação* @param p5_pid name* Endereço dos dados de sucesso do recebimento de pagamento do comerciante* @param p9_saf Endereço de entrega* @param pa_mp informações de extensão do comerciante* @param pd_frpid código bancário* @param pr_needResponse mecanismo string* p0_param keyvalue keychant @return*/ public static stringhmac (string p0_cmd 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 = newbuilder (); // tipo de negócios svalue.append (p0_cmd); // número do comerciante svalue.append (p1_merid); // Número da ordem do comerciante svalue.append (p2_order); // Valor do pagamento Svalue.append (p3_amt); // troca de moeda svalue.append (p4_cur); // nome do produto svalue.append (p5_pid); // tipo de produto svalue.append (p6_pcat); // Descrição do produto Svalue.append (p7_pdesc); // Endereço do comerciante recebe dados de dados de pagamento Svalue.append (p8_url); // Endereço de entrega Svalue.append (p9_saf); // informações de extensão do comerciante svalue.append (PA_MP); // código bancário svalue.append (pd_frpid); // mecanismo de resposta svalue.append (pr_needResponse); Retornar PaggetUtil.hmacsign (svalue.toString (), KeyValue); } /*** Retorne o método HMAC HMAC de verificação** @param HMAC Código de verificação criptografado enviado pelo gateway de pagamento* @param p1_merid Número do comerciante* @param r0_cmd tipo de negócios* @param R1_Code Resultado de pagamento* @param r2_trxid yibao Payment Flow Number* @param r5_pid Nome do produto* @param r6_order Número do pedido do comerciante* @param r7_uid yibao Membro de pagamento ID* @param r8_mp Informações de extensão do comércio* @param r9_btype Resultado de transação Retorno* @param keyvalue key* return*/ public static boolean verify 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 do comerciante svalue.append (p1_merid); // tipo de negócios svalue.append (r0_cmd); // resultado de pagamento svalue.append (r1_code); // YIBAO PAGAÇÃO Número da transação de pagamento SValue.append (r2_trxid); // Valor do pagamento Svalue.append (r3_amt); // moeda de transação svalue.append (r4_cur); // nome do produto svalue.append (r5_pid); // Número da ordem do comerciante svalue.append (R6_order); // YIBAO PAGESS MEMBRO ID SVALUE.APNEND (R7_UID); // informações de extensão do comerciante svalue.append (r8_mp); // Resultado da transação Tipo de retorno svalue.append (r9_btype); String snewSting = PaymentUtil.hmacsign (svalue.toString (), KeyValue); retornar senestring.equals (HMAC); } / ** * @param Avalue * @param akey * @return * / public static string hmacsign (string alvalue, string akey) {byte k_ipad [] = new 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 (); } / ** * * @param args * @param key * @return * / 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) {// System.out.println (HMACSIGN ("ANNULCARD1000043252120080620160450.0HTTP: //localhost/szxpro/callback.asp 海? 4 564868265473632445648682654736324511 "," 8upp0ke8sq73zvp370vko7c39403rtk1ywx40td6irh216036h27eb12792t ")); }}Yibao Retorno de chamada
Ponto a ponto: Yibao acessa diretamente o comércio eletrônico, não há cliente aqui.
Este método é um uso imperdível e não podemos recebê-lo dessa maneira! Porque não temos um IP fixo
Yibao tem um mecanismo de reenvio. Se ele visitar você e você não o enviar de volta a mensagem, ele continuará renderizado!
O comércio eletrônico precisa retornar uma string começando com o sucesso!
Oriente o navegador do cliente para redirecionar para o comércio eletrônico. É para permitir que os clientes acessem o comércio eletrônico!
Não pode ser usado!
HMAC: 13 Valor do parâmetro + KeyValue (Key) + Algoritmo (MD5)
13 Valor do parâmetro: definido por você!
KeyValue: O que Yibao nos enviou depois que nos registramos, apenas nós e Yibao sabíamos sobre isso!
O algoritmo com o MD5 subjacente: PaggetUtil.buildhmac (14), que retorna o HMAC
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.