最近、プロジェクトにはWeChatの支払いが必要であり、WeChatの公式アカウントの支払いを見ました。難しいことではありませんが、詳細はまだ注意を払う必要があります。私は一日のほとんどをデモを書くのに費やし、支払いプロセスを完全にテストしました。以下のWeChat公式アカウントの支払いの経験を共有しましょう。
1.公式アカウントWeChatの支払いを構成します
WeChatの公式アカウントの支払いアドレスとテストホワイトリストを構成する必要があります。
例:支払いのアドレスJSページはhttp://www.xxx.com/shop/pay/です
次に、ここに構成されていますwww.xxx.com/shop/pay/
2。開発プロセス
API(アドレスhttp://pay.weixin.qqq.com/wiki/doc/api/index.php?chapter=7_4)のAPI(アドレスhttp://pay.weixin.qqqqqqqqqqu)の料金を支払うために、Wechatの公式アカウントを借ります。次のように:
3. WeChatサーバーに注文します
Unified Single Interfaceに電話して、Wechat支払いのPrepay_id(http://pay.weixin.qq.com/doc/api/index.php?chapter=9_1)を取得できるようにします。
このインターフェイスを呼び出す前に、H5支払いのために記入する必要があるOpenIDであるいくつかのフィールドがあります。
3.1 OpenIDを取得します
Web Authorizationフォーム(http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html)
WeChatで次のリンクを送信します
https://open.weixin.qc.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=url&response_type=code&scope=snsapi_base&state=23#wechat_redirect
3.2 PREPAY_IDを取得するために注文します
コードは次のとおりです。これは、実際には投稿を介してXMLファイルを送信して、WeChatサーバーから送信されたPREPAY_IDを取得しています。
java.io.bytearrayinputStreamをインポートします。 JavaioioExceptionをインポートします。 JavaioInputStreamをインポートします。 JavaiounsupportedencodingExceptionをインポートします。 Javautildateをインポートします。 javautilhashmapをインポートします。 Javautiliteratorをインポートします。 JavautilMapをインポートします。 javautilmapentryをインポートします。 Javautilrandomをインポートします。 javaxservlethttphttpservletrequestをインポートします。 javaxservlethttphttpservletresponseをインポートします。 orgapachecommonscodecdigestdigestutilsをインポートします。 Import orgspringframeworkstereotypecontroller; orgspringframeworkwebbindannotationrequestmappingをインポートします。 Import orgxmlpullvxmlpullparser; Import orgxmlpullvxmlpullparserexception; Import orgxmlpullvxmlpullserfactory; comfasterxmljacksondatabindjsonnodeをインポートします。 Import Comgsonoauthoauth; comgsonoauthpayをインポートします。 comgsonutilhttpkitをインポートします。 comsyutildateTimeutilをインポートします。 comsyutiljsonutilをインポートします。 @Controller @RequestMapping( "/pay")パブリッククラスwxpaycontroller {@requestmapping(value = "wxprepaydo")public void jspay(httpservletrequest request、httpservletresponse応答、httpservletresponse応答、ストリングコールバック) if(openID == null){openID = getUseropenid(request); } string appid = "wx16691fcb0523c1a4"; string paternerkey = "iningfeng1234567fdfwfdfd1ss234567"; string out_trade_no = getTradeno(); map <string、string> paramap = new hashmap <string、string>(); paramapput( "appid"、appid); paramapput( "attach"、 "test"); paramapput( "body"、 "テスト購入支払い"); paramapput( "mch_id"、 "10283271"); paramapput( "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"); paramapput( "notify_url"、 "http:// wwwxxxco/bank/page/wxnotify"); string sign = getsign(paramap、paternerkey); paramapput( "sign"、sign); // Unified Order https:// apimchweixinqqcom/pay/unifiderdorder string url = "https:// apimchweixinqqcom/pay/unifiedorder";文字列xml = arraytoxml(paramap); string xmlstr = httpkitpost(url、xml); //プリペイド製品ID文字列prepay_id = ""; if(xmlstrindexof( "success")!= -1){map <string、string> map = doxmlparse(xmlstr); prepay_id =(string)mapget( "prepay_id"); } map <string、string> paymap = new hashmap <string、string>(); PayMapput( "appid"、appid); PayMapput( "Timestamp"、create_timestamp()); PayMapput( "noncestr"、create_nonce_str()); PayMapput( "signtype"、 "md5"); PayMapput( "package"、 "prepay_id =" + prepay_id); string paysign = getsign(paymap、paternerkey); PayMapput( "pg"、prepare_id); PayMapput( "Paysign"、Paysign); WebutilResponse(Response、webutilpackjsonp(callback、jsonutilwarpjsonnoderesponse(jsonutilobjecttojsonnode(paymap))toString())); } / ** * xmlへのマップ * * @param arr * @return * / public string arraytoxml(map <string、string> arr){string xml = "<xml>"; iterator <entry <string、string >> iter = arrentryset()iterator(); while(iterhasnext()){entry <string、string> entry = iternext();文字列key = entrygetKey(); string val = entrygetValue(); xml + = "<" + key + ">" + val + "</" + key + ">"; } xml += "</xml>"; XMLを返します。 } // get openid private string getuseropenid(httpservletrequest request)throws exception {string code = requestgetParameter( "code"); if(code == null){string openid = requestgetParameter( "openID"); OpenIDを返します。 } oauth o = new oauth(); string token = ogettoken(code); jsonnode node = jsonutilstringtojsonnode(token); string openid = nodeget( "openid")astext(); OpenIDを返します。 } private string create_nonce_str(){string chars = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789";文字列res = ""; for(int i = 0; i <16; i ++){random rd = new Random(); res += charscharat(rdnextint(charslength()-1)); } RESを返します。 } private string getAddrip(httpservletrequest request){return requestgetRemoteaddr(); } private string create_timestamp(){return longtostring(systemcurrenttimemillis() / 1000); } private string getTradeno(){String Timestamp = DateTimeUtilFormatdate(new Date()、DateTimeUtildateTime_Pattern); 「hzno」 +タイムスタンプを返します。 } private string getSign(Map <String、String> Params、String PaternerKey)Strows unsupportedenCodingException {string string1 = paycreatesign(params、false); string stringsigntemp = string1 + "&key =" + paternerkey; string signvalue = digestutilsmd5hex(stringsigntemp)touppercase(); signvalueを返します。 } private Map <String、string> doxmlparse(string xml)throws xmlpullparserexception、ioexception {inputstream inputstream = new bytearrayinputStream(xmlgetBytes()); map <string、string> map = null; xmlpullparser pullparser = xmlpullparserfactorynewinstance()newPullParser(); PullparserSetinput(inputStream、 "utf-8"); // XML int eventType = purparsErgetEventType()のXMLデータを解析するように設定します。 while(eventType!= xmlpullparserend_document){switch(eventType){case xmlpullparserstart_document:map = new hashmap <string、string>();壊す;ケースxmlpullparserstart_tag:string key = pullparsergetname(); if(keyequals( "xml"))break; string value = pullparsernextText(); Maput(key、value);壊す;ケースxmlpullparserend_tag:break; } eventType = pullparsernext(); }マップを返します。 }}4。H5支払い
H5の支払いは実際には非常に簡単です。 WeChat Embedded BrowserのJSメソッド(http://pay.weixin.qq.com/doc/api/index.php?chapter=7_7)を呼び出す必要があります。
<%@ページ言語= "java" contentType = "text/html; charset = utf-8" pageencoding = "utf-8"%> <%@ taglib prefix = "spring" uri = "http:// wwwspringframeworkorg/tags"%> <%string = requestgetextextpath(); string basepath = requestgetScheme() + "://" + requestgetServername() + ":" + requestgetServerport() + path + "/"; %> <!doctype html public " - // w3c // dtd html 01 transitional // en" "http:// wwworg/tr/html4/loosedtd"> <html> Maximum-Scale = 0、user-scalable = 0 " /> <meta name =" apple-mobile-web-app-capable "content =" yes " /> <meta name =" content = "black" /> <meta name = "apple-mobile-web-app-status =" furm " /" content = "電話= no"/> <title>テスト支払い</title> <link href = "/css?v = 0" rel = "styleSheet" type = "> </css> </css> <body> <div> href = "javascript:pay();"> pay now </a> </p> </div> </div> <script type = "text/javascript" src = "/js/zeptominjs"> </script> <script = "text/javascript" src = "/js/js"/javas "/javas"/javas> < urlparameter( "appid"); var timestamp = urlparameter( "Timestamp"); var noncestr = urlparameter( "noncestr"); var pg = urlparameter( "pg"); var signtype = urlparameter( "signtype"); var paysign = urlparameter( "paysign"); function onbridgeready(){weixinjsbridgeinvoke( 'getBrandWcPayRequest'、{"appid":appid、//公式アカウントの名前、「タイムスタンプ」:タイムスタンプ、//タイムスタンプ、// 1970年以降の秒数: "noncestr、// randance": "" " + prectring" SIGNTYPE、// WECHAT署名方法:「Paysign」:Paysign // Wechat Signature}、function(reserr_msg == "get_brand_wcpay_request:ok"){alert( "pay cuscuper")成功していますが、それが絶対に信頼できることを保証しません。 } function 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>効果は次のとおりです
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。