Recentemente, o projeto requer pagamento do WeChat e, em seguida, olhei para o pagamento da conta oficial do WeChat. Embora não seja difícil, os detalhes ainda precisam receber atenção. Passei a maior parte do dia escrevendo uma demonstração e testei completamente o processo de pagamento. Vamos compartilhar a experiência do pagamento da conta oficial do WeChat abaixo.
1. Configure o pagamento oficial da conta Wechat
Precisamos configurar o endereço de pagamento da conta oficial do WeChat e testar a lista de permissões.
Por exemplo: o endereço da página JS de pagamento é http://www.xxx.com/shop/pay/
Então aqui está configurado www.xxx.com/shop/pay/
2. Processo de desenvolvimento
Pegue emprestado a conta oficial do WeChat para pagar pela API (endereço http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=7_4), que precisamos desenvolver está marcado em vermelho. do seguinte modo:
3. Faça um pedido com o servidor WeChat
Ligue para a interface única unificada para que você possa obter o pagamento do Papay_ID do WeChat (http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=9_1).
Antes de chamar essa interface, existem vários campos que são o OpenIds que devem ser preenchidos para o pagamento do H5.
3.1 Obtenha o OpenID
Você pode usar o formulário de autorização da web (http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html)
Envie o seguinte link no WeChat
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=url&repSonse_type=code&scope=SNSAPI_BASTATATATATSONE_TYPETHATHATET_SCOPE
3.2 Faça um pedido para obter pré -pagamento_id
O código é o seguinte, que está realmente enviando um arquivo XML por meio da postagem para obter o pré -PAY_ID enviado do servidor WeChat.
importar java.io.byteArrayInputStream; importar javaioioException; importar javaioInputStream; importar javaiounsupportEnCodingException; importar javautildate; importar javautilhashmap; importar javautiliterator; importar javautilmap; importar javautilmapentry; importar javautilrandom; importar javaxServleThttphttPServletRequest; importar javaxServLetHttphttPServletResponse; importar orgapacheCommonsCodecDigestDigestutils; importar orgspringframeworktereotyPeController; importar orgspringFrameworkWebBindannotationRequestMapping; importar orgxmlpullvxmlpullParser; importar orgxmlpullvxmlpullParseRexception; importar orgxmlpullvxmlpullParSerFactory; importar comfasterxmljacksondatabindjsonNode; importar comgsonoauthoauth; importar comgsonoauthpay; importar comgsonutIlHttpkit; importar comsyutildateTimeUtil; importar comsyutiljsonutil; @Controller @RequestMapping ("/Pay") Classe public wxPayController {@RequestMapping (value = "wxPrepaydo") public void jspay (httpservletRequest request, httpsSponsensensense, resposta de string), exceção "// getIDIDDIDDIDETIL; if (openId == null) {OpenId = getUserropenId (request); } String appid = "wx16691fcb0523c1a4"; String paternerkey = "iningfeng1234567fdfwfdfd1ss234567"; String out_trade_no = getTradeno (); Mapa <string, string> paramap = new hashmap <string, string> (); Paramapput ("Appid", Appid); Paramapput ("Anexar", "teste"); Paramapput ("corpo", "pagamento de compra de teste"); Paramapput ("mch_id", "10283271"); parapapput ("nonce_str", create_nonce_str ()); Paramapput ("OpenId", OpenID); Paramapput ("out_trade_no", out_trade_no); Paramapput ("spbill_create_ip", getaddrip (request)); Paramapput ("Total_Fee", "1"); Paramapput ("Trade_type", "JSAPI"); parapapput ("notify_url", "http: // wwwxxxco/bak/page/wxnotify"); String signo = getSign (paramap, paternerKey); parapapput ("sinal", sinal); // Ordem unificada https: // apimchweixinqqcom/pay/unified string url = "https: // apimchweixinqqcom/pay/unifiedorder"; String xml = Arraytoxml (paramap); String xmlstr = httpkitpost (url, xml); // ID do produto pré -pago string string pré -paga_id = ""; if (xmlstriNexOf ("success")! = -1) {map <string, string> map = doxmlParse (xmlstr); pré -paga_id = (string) mapget ("pré -any_id"); } Mapa <string, string> paymap = new hashmap <string, string> (); paymapput ("Appid", Appid); paymapput ("timestamp", create_timestamp ()); paymapput ("não -cest", create_nonce_str ()); paymapput ("SignType", "MD5"); paymapput ("pacote", "pré -any_id =" + pré -paga_id); String PaySign = GetSign (Paymap, Paternerkey); paymapput ("pg", preparar_id); paymapput ("Paysign", PaySign); WebutilResponse (resposta, webutilpackjsonp (retorno de chamada, jsonutilwarpjsonnoderSponse (jsonutilobjectTojsonNode (Paymap)) tostring ())); } / ** * Map para xml * * @param arr * @return * / public String Arraytoxml (map <string, string> arr) {string xml = "<xml>"; Iterator <entrada <string, string >> iter = ArrentrySet () iterator (); while (iterhasNext ()) {Entry <String, String> Entry = ITERNEXT (); String key = EntryGetKey (); String val = EntryGetValue (); xml + = "<" + key + ">" + val + "</" + key + ">"; } xml += "</xml>"; retornar xml; } // Obtenha o OpenId Private String getUserropenId (solicitação httpServletRequest) lança a exceção {string code = requestGetParameter ("code"); if (code == null) {string openId = requestGetParameter ("OpenId"); retornar openID; } Oauth o = new oauth (); String token = OGETTOKN (código); JSONNODE NODE = JSONUTILSTRINGTOJSONNODE (TOKEN); String OpenId = NodeGet ("OpenId") ASTEXT (); retornar openID; } private string create_nonce_str () {string chars = "abcdefghijklmnopqrStuvwxyzabcdefghijklmnopqrstuvwxyz0123456789"; String res = ""; for (int i = 0; i <16; i ++) {aleatório rd = new aleatom (); res += charscharat (rdNextInt (charSlength () - 1)); } retornar res; } private string getAddrip (httpServletRequest Request) {return requestGetRemoTeaddr (); } private string create_timestamp () {return longToString (SystemCurrentTimEmillis () / 1000); } private String getTradeno () {string timestamp = DateTimeUtilFormatDate (new Date (), DateTimeUtildAtTime_Pattern); retornar "hzno" + timestamp; } private string getSign (map <string, string> params, string paternerKey) lança UnsupportEnCodingException {String String1 = payCreateSign (params, false); String stringsIngTemp = string1 + "& key =" + paternerKey; String SignValue = DigestUtilsmd5hex (StringsIngTemp) touppercase (); return signovValue; } mapa privado <string, string> doxmlparse (string xml) lança xmlpullParseRexception, ioException {inputStream inputStream = new ByTearRayInputStream (xmlgetBytes ()); Mapa <string, string> map = null; XmlpullParser PullParser = xmlpullParSerFactoryNewInstance () newPullParser (); PullParSerSetInput (InputStream, "UTF-8"); // Defina os dados XML a serem analisados para XML int EventType = PullParSergeTEventType (); while (eventType! = xmlpullparserend_document) {switch (eventType) {case xmlpullparserstart_document: map = new hashmap <string, string> (); quebrar; case xmlpullParSerstart_tag: string key = pullParSergetName (); if (keyequals ("xml")) quebra; String value = pullParserNextText (); maput (chave, valor); quebrar; case xmlpullparserend_tag: quebra; } EventType = PullParserNext (); } mapa de retorno; }}4. Pagamento H5
O pagamento H5 é realmente muito simples. Você só precisa ligar para o método JS do navegador incorporado do WeChat (http://pay.weixin.qq.com/wiki/doc/api/index.php?chapter=7_7)
<%@ Page Language = "java" contentType = "text/html; charset = utf-8" pageEncoding = "utf-8"%> <%@ taglib prefix = "spring" uri = "http: // wwwspringframeworksorg/tags"%> <%string patth = requestgetget: String basalEpath = requestGetScheme () + ": //" + requestGetServerName () + ":" + requestGetServerport () + path + "/"; %> <! Doctype html public "-// w3c // dtd html 01 transitória // pt" "http: // wwworg/tr/html4/loosedtd"> <html> <head> <meta-tentset = "utf-8"/> <meta nome = " Máximo-escala = 0, Scalable = 0 " /> <meta name =" Apple-Mobile-Web-Appabable "Content =" Sim " /> <meta name =" Apple-Mobile-Web-App-Status-Bars-S-S-S-S-S-S-S-S-S-STYLE "Content =" Black " /> <meta" "Apple-Mobile-WeB-STATUSBAR" Content = "Telephone = NO"/> <title> Pagamento de teste </ititure> <link href = "/css/csss? v = 0" rel = "Stylesheet" type = "text/css"> </fience> <li> <liM> <div> <div> <div> weChat js Payment teste </div> <liv> <ul> <li> href = "javascript: pay ();"> pague agora </a> </p> </div> </div> <script type = "text/javascript" src = "/js/zeptominjs"> </script> <script type = "text/javscript" src = "/js/comum"> = urlparameter ("Appid"); var timestamp = urlParameter ("Timestamp"); var noncestr = urlparameter ("não -cest"); var pg = urlparameter ("pg"); var signType = urlParameter ("SignType"); var paysign = urlparameter ("PaySign"); function onBridgeReady(){ WeixinJSBridgeinvoke( 'getBrandWCPayRequest', { "appId" : appId, //The name of the official account, passed in "timeStamp": timeStamp, //Timestamp, number of seconds since 1970 "nonceStr" : nonceStr, //Random string "package" : "prepay_id=" + pg, "signType" : SignType, // Método de assinatura WeChat: "Paysign": Paysign // WeChat Signature}, function (res) {if (ressr_msg == "get_brand_wcpay_request: ok") bem -sucedido, mas não garante que seja absolutamente confiável. } função pay () {if (typeof weixinjsbridge == "undefined") {if (documentAdDeventListener) {documentAdDeventListener ('weixinjsbridgeready', onbridgeready, false); } else if (documentattachevent) {documentattachevent ('weixinjsbridgeready', onbridgeready); documentattachevent ('onweixinjsbridgeready', onbridgeready); }} else {onbridgeready (); }} </script> </body> </html> O efeito é o seguinte
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.