1: Conhecimento precoce de alfabetização de pagamento do WeChat
O pré -requisito é que já existe uma conta oficial que se candidatou à função de pagamento do WeChat e, em seguida, precisamos obter a conta oficial da conta Appid e o WeChat Merchant. Isso pode ser encontrado na conta oficial do WeChat e na plataforma de comerciantes de pagamento do WeChat, respectivamente. De fato, depois de solicitar com sucesso a função de pagamento, o WeChat encaminhará o e -mail por e -mail. Com essas informações, podemos ir para a página de suporte ao Serviço de Pagamento do WeChat: https://pay.weixin.qq.com/service_provider/index.shtml
Abra esta página e clique no link [Documento de Desenvolvimento] no canto superior direito para inserir a página de descrição do documento da API, que se parece com o seguinte
Escolha o círculo vermelho para digitalizar o código a pagar, o que significa que precisamos fazer o método de acesso. Mova o mouse para o exposto acima e solicite que você visualize o documento de desenvolvimento. Se você não sabe ver isso, pode tomar um banho e ir para a cama. Você realmente não é adequado para um programador. O endereço é o seguinte:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1 Você verá depois de abrir no seu navegador
O conteúdo em que focamos e lemos já está marcado com uma elipse vermelha. Primeiro, leia as especificações do protocolo nas [regras da interface]. Brincadeira, se você não ler isso, deseja fazer o pagamento do WeChat. É como se você quisesse pegar garotas. Você deve coletar algumas informações básicas básicas primeiro e entender as características da outra parte, caso contrário, como você pode se comunicar abaixo. Acontece que apenas programadores que podem buscar garotas são bons vendedores. Depois de sair do tópico, examinaremos os casos e as especificações da [Introdução à cena]. Basta olhar para o logotipo do WeChat Pay. Isso finalmente o coloca na nossa página de pagamento de código QR, que parece mais profissional. Depois, concentre -se no [Modo 2]
Aqui vamos usar o método Mode 2 para realizar a função de pagamento do código de digitalização da página do PC.
A explicação oficial do Modo 2 por WeChat é a seguinte: "O sistema de back -end do comerciante chama primeiro a interface única unificada do WeChat Pay, o sistema de back -end do WeChat retorna o parâmetro Code_URL, o sistema de back -end do Merchant é o Código de Código de Code_url e o Código do Código do Código do Código do Código e o Código de Código e o Código de Código e o Código do Código e o Código do Código e o Código do Código do Código e o Código do Código do Código e o Código do Código do Código. iniciar o pagamento. " Se você entender, devemos primeiro ligar para o WeChat para fornecer uma interface única unificada e obter uma informação -chave code_url (como o que diabos é esse code_url, eu não sei) e, em seguida, geramos um código QR por meio de nosso próprio programa. Eu uso a biblioteca Zxing do Google aqui. Em seguida, basta exibir o código QR na página da Web do PC. Dessa forma, o usuário do terminal pagará digitalizando o código e o pagamento será concluído. Você deve estar muito animado para ver isso. Você acha que o pagamento do WeChat é tão simples. Há outra coisa que ainda não sabemos. Os clientes sabem que pagaram, mas o lado do servidor ainda não sabe. Com o QI dos desenvolvedores do WeChat, eles pensam nesse problema há muito tempo. Portanto, quando você chama a interface única unificada, existe um parâmetro necessário que é o URL de retorno de chamada. Ou seja, se o cliente pagar com sucesso, o WeChat enviará alguns dados ao nosso próprio servidor por meio deste URL e, em seguida, analisaremos os dados em segundo plano para concluir nossas próprias operações. Só então podemos saber se o cliente realmente pagou através do WeChat. Dessa forma, todo o processo acabou, e esse é o padrão 2. O WeChat usa um diagrama de tempo para representar esse processo.
É complicado expressar e parece ser difícil. Para resumir, o que nosso servidor deve fazer é o seguinte:
1. Passe os parâmetros corretos (é claro, nosso URL de retorno de chamada) e a verificação de assinatura através da interface única unificada e obtenha os dados correspondentes de code_url a partir dos dados de retorno.
2. Com base nos dados Code_URL, geramos uma imagem de código QR e os exibimos na página da web do navegador.
3. Adicione nosso próprio processamento de lógica de negócios no URL do retorno de chamada.
A alfabetização acabou agora, e você finalmente sabe que tipo de processo pagar digitalizando o código. Vamos dar uma olhada em seu uso relevante da API e fazer um bom trabalho para processar cada etapa.
Dois: processo de desenvolvimento
Antes de desenvolver o código, prepare algumas coisas primeiro.
1. Adicione a dependência do Maven de Zxing
2. Adicione a dependência do Maven da Jdom
3. Faça o download do programa de demonstração do Java Version SDK, o endereço está aqui
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
Precisamos de md5util.java e xmlutil.java dois arquivos
4. Usamos a versão 4.5.1 HttpClient, lembre -se de adicionar dependências mavenas
Depois que os preparativos acima forem concluídos, continue lendo:
Primeiro, precisamos chamar a interface única unificada do WeChat. Quando clicamos no single Unified na [lista de API], veremos uma página como esta:
Tomando a situação real da minha chamada como exemplo, os seguintes parâmetros são necessários. Para a conveniência de todos, eu o transformei em um objeto Pojo. O código é o seguinte:
classe pública UnifiedOrderdTo implementa WeixinconStants {private String Appid; Body String Private; Private String Device_info; Private String mch_id; String privada noNEC_STR; Private String notify_url; private String OpenId; SignIrt String_Trade_No; Private String string String_create_ip; Privert Int Int; {this.Appid = Appid; this.mch_id = wxPaymentAccount; this.Device_info = device_info_web; this.notify_url = callback_url; this.trade_type = trade_type_native;} public string getAppId () {Return; Appid;} public String getBody () {retornar corpo;} public void setBody (String body) {this.body = body;} public string getDevice_info () {return device_info;} public void setDevice_info (String Device_info) {this.MEVICE_INFO =nfo = Device_info; mch_id;} public void setMch_id (string mch_id) {this.mch_id = mch_id;} public string getNonce_str () {return nonce_str;} public void setNonce_str (string nonce_str) {this.Nonce_str = NONCE_STR;}} setNotify_url (string notify_url) {this.notify_url = notify_url;} public string getOpenId () {return openId;} public void SetOpenId (String OpenId) {this.openid = OpenId;} public String getout_trade_no () {return ou out_trade_no) {this.out_trade_no = out_trade_no;} public string getspbill_create_ip () {return spbill_create_ip;} public void Setspbill_create_ip (string spbill_create_ip) {this.spbill_create_iP_IP = SPBILT_IP (String (string) total_fee;} public void setTotal_fee (int total_fee) {this.total_fee = total_fee;} public String gettrade_type () {return trade_type;} public void settrade_type (string_type) {this.trade_type = Setsign (string signo) {this.sign = signo;} public String getProduct_id () {return product_id;} public void setProduct_id (String product_id) {this.product_id = product_id;} public string generatexmlContent () {string xml = "<xml>" "" + "<vice_info> web </posity_info>" + "<mch_id>" + this.mch_id + "</mch_id>" + "<Nonce_Str>" + this.nonche_str + "</nonce_str>" + "<notify_url>" + this.notify_url_url + "" this.out_trade_no + "</out_trade_no>" + "<Product_id>" + this.product_id + "</product_id>" + "<spbill_create_ip>" + this.spbill_create_ip + "</spbill_create_ip>" + "<_feee>" "</total_fee>" + "<Trade_type>" + this.trade_type + "</trade_type>" + "<Sign>" + this.sign + "</Sign>" + "</xml>"; "& mch_id =" + this.mch_id + "& nonce_str =" + this.nonce_str + "? ify_url =" + this.notify_url + "& out_trade_no =" + this.out_trade_no + "& product_id =" this.product_id + spbill & spbill this.spbill_create_ip + "& total_fee =" + string.valueof (this.total_fee) + "& trade_type =" + this.trade_type; content = content + "& key =" + weixinconStants.md5_api_key; stringnature = utIninPaymentutil.md5 Signature.TOUPPERCASE ();}}A explicação de cada variável de membro pode ser encontrada na descrição da [interface única unificada].
Depois disso, precisamos preencher o conteúdo que definimos, ligue para a interface para obter os dados de retorno, obter os dados Code_URL e gerar uma imagem bidimensional com base nela, retornar o endereço da imagem à página da Web do PC e, em seguida, será exibida. Aqui, faremos uma observação especial que, quando clicarmos no pagamento do WeChat, chamaremos nosso próprio controlador de back -end Springmvc através do método Ajax e, em seguida, completaremos a análise unificada de interface única do WECHAT por meio de httpclient no método correspondente do controlador para obter os dados XML retornados por code_url e, em seguida, gerar o código QR e retornar para retornar aos XML. O código implementado no controlador é o seguinte:
Map <string, objeto> resultado = novo hashmap <string, object> (); unifiedOrderdDTO dTO = new UnifiedOrderdTo (); if (Cash == null || "" .equals (caixa)) {resultado.put ("error", Cash não poderia ser zero "); resultado; totalfee); dto.setproduct_id (string.valueof (system.currenttimemillis ())); dto.setbody ("reparo"); dto.setNonce_str (string.valueof (system.nanotime ()); loginFo logininfo = tountininfoutil.gettility ()); loginFo LoginFo = tountinfoutil.gettility ()); LoginFo Logininfo = LoginFoutil.gettility ()); Loginfo Logininfo = LoginFoutil.GetilOnFonef); sinalizador dto.setout_trade_no ("seu número de pedido + informações importantes, ele é enviado de volta após o retorno de chamada do WeChat, você pode verificar"); dto.settotal_fee (totalfee); dto.setspill_create_ip ("127.0.1"); dto.makesign ()); logger.info ("conteúdo xml:" + dto.gerestyxmlContent ()); tente {httpclient httpClient = httpclientBuilder.create (). build (); Httppost post = new httppost (weixinconStants.unifiedordorder_url); post.addheader ("content-type", "text/xml; charset = utf-8"); stringentity xmlentity = nova stringentity (dto.GeraRexmlContent (), ContentType.text_xml); post.setEntity (xmlentity); httproponse httpropSe = httpclient.execute (post); string respondexml = entityutils.toString (httpResponse.getEntity (), "utf-8"); Code_url ContentMap <String, String = ""> ResultMap = (Map <String, String = "">) xmlutil.doxmlParse (Responsexml); Logger.info ("Resposta Code_url:" + ResultMap.get ("Code_url")); String codeurl = resultado! ! "". Equals (codeurl)) {string imageurl = generateqrcode (codeurl); resultado.put ("qRimage", imageurl);} post.releaseconnection ();} catch (exceção e) {e.printstacktrace ();} resultado.put ("success", "1"); resultado; </string,> </string,> </string, objeto> </string, objeto>O código que gera o código QR é o seguinte:
String privada generateqrcode (string codeurl) {pasta de arquivo = new File (BasePath + "qrcode"); if (! cal daxists.exists ()) {Foldler.mkdirs ();} string f_name = uuidutil.uuid () + ".png"; try; fio = new FileOutputStream (f); MultiformatWriter multInFalMAtSwriter = new MultInFalMatWriter (); mapa dicas = new hashmap (); hints.put (codehinttype.character_set, "utf-8"); // Definir o conjunto de caracteres Tipo de codificação bitMatrix bitMatrix = null; bitMatrix = multiformatwriter.encode (codeurl, barcodeformat.qr_code, 300, 300, dicas); bufferImage imagem = imagem); f_name);} catch (Exceção E1) {e1.printStackTrace (); retorna null;}}Neste momento, depois de digitalizar o código WeChat QR no cliente, usaremos o retorno de chamada para fazer o URL e retornar os dados para nós. Concluiremos nosso próprio processamento no método de retorno de chamada. É importante observar aqui que sua interface de retorno de chamada deve ser implementada através do método HTTP POST, caso contrário, os dados XML não serão aceitos. O código para o processamento de retorno de chamada é o seguinte:
@RequestMapping (value = "/your_callback_url", método = requestMethod.post) @ResponseBodyPublic void Finishment (httpServletRequest Solicy, httpServletResponse resposta) {try {Logger.info ("start to den -retorno do servidor weixin:" new hashmap <string, string = ""> (); inputStream inputStream = requestInputStream (); // Leia o fluxo de entrada saxbuilder saxbuilder = new saxbuilder (); document Document = saxbuilder.build (inputstream); // get the root eleg element root = elet); root.getChildren (); iterator it = list.iterator (); while (it.hasnext ()) {elemento e = (elemento) it.next (); string k = e.getName (); string v = ""; listar filhos = e.getChildren (); if (childre.isempt ()) {v = e.getTextTectText (); Xmlutil.getChildrentExt (filhos);} resultMap.put (k, v);} // Verifique a assinatura! ! ! /*String[] keys = resultMap.keySet().toArray(new String[0]);Arrays.sort(keys);String kvparams = "";for(int i=0; i<keys.length; i++)="" {="" if(keys[i].equals("sign"))="" continue;="" }="" Signature algorithm="" if (i = "=" 0) = "" kvparams = "" " + =" (Keys [i] "" = " + resultMap.get (keys [i]));} else {kvparams + = (" & "" "" keys [i] = "" & key = " + weixinconStants.md5_api_; WeixInPaymentUtil.md5Encode (Esigno, "UTF-8"); = "" se (! ReturnCode = "ResultMap.get (" Return_code ");" outtradeno); = "" logger.info ("total_fee =" "nfee); =" "Process de processamento de negócios =" "se (" success ".equals (returncode)) =" "TODO: =" "your =" "Business =" "" "" add = "" "" "" "" Response.getWriter (). Print (xmlutil.getretResultxml (resultmap.get ("return_code"), = "" resultMap.get ("return_code")); = "" else = "" resultMap.get ("return_msg")); = "" "Catch (iOexception =" ") (jdomexception = "" e1) = "" e1.printstacktrace (); = ""}Lembre -se de usar as duas classes de XMLutil e Md5util usadas na versão Java oficial da demonstração do WeChat. O código de demonstração pode ser encontrado em sua página de demonstração oficial. As dependências do Maven relevantes são as seguintes:
<Depencency> <voundId> jdom </proupId> jdom </stifactId> <versão> 1.1 </version> </dependency> <pendecence> <puperid> com.google.zxing </proupId> core </stifactId> <versão> 3.3.0 </versão </dependency>
Finalmente, devo prestar atenção especial à assinatura. Eu baixei diretamente a versão Java do programa de demonstração do site oficial do WeChat para obter a assinatura. Sugiro que você faça o mesmo, porque essa é a melhor opção para garantir que a assinatura do MD5 seja consistente. Para o algoritmo específico para gerar assinaturas, você pode visualizar o documento oficial do WeChat. Aqui, recomendamos fortemente que você deva explicar a API oficial. 90% dos vários problemas que você encontra no desenvolvimento são porque você não lê os documentos oficiais, mas confie em um blog de alguém! Esse é o objetivo e o objetivo real da minha escrita neste artigo. De acordo com os documentos oficiais, eu o implementei com meu código Java. Digitalize o código QR nas páginas da Web Wechat PC e o pagamento pelo pagamento definitivamente voará no seu aplicativo da Web.
O exposto acima é a implementação Java Springmvc da página da web do PC WECHAT QR Código Pagamento (versão completa) introduzida pelo editor. Espero que seja útil para todos. Se você tiver alguma dúvida, deixe -me uma mensagem e o editor responderá a todos a tempo. Muito obrigado pelo seu apoio ao site wulin.com!