WeChatの支払いは現在ますます人気があり、WeChatの支払いにすばやくアクセスできる多くの製品があります。しかし、便利であることに加えて、私たちは徐々に第三者に頼って物事を行い、独立して考える能力を失います。今回は、以前に開発したWeChatの支払いを共有する予定です。
1。H5公式アカウントの支払い
キーポイント:OpenIDを正しく取得して単一のインターフェイスを統合し、支払い結果通知を正しく処理し、支払い承認ディレクトリを正しく構成します
H5の支払い方法は、広く使用されている方法です。この支払い方法は、主にWeChatのカスタムメニューを備えたWebページに使用されます。携帯電話にインストールされているWeChatクライアントに依存しています。 WeChatの高いバージョンのみがWeChatの支払いをサポートしています。私のプロセスに従うための次の指示に注意してください。
1。支払いのページを書きます。テストであるため、少し簡単です。
<%@ page Language = "java" import = "java.util。*" pageencoding = "utf-8"%> <%string path = request.getContextPath(); string basepath = request.getscheme()+"://"+request.getServername()+":"+request.getServerport()+path+"/"; %> <!doctype html public " - // w3c // dtd html 4.01 transitional // en"> <html> <head> <base href = "<%= basepath%>"> <title> wechat支払い例</title> <meta name = "viewport =" <link rel = "styleSheet" type = "text/css" href = "styles.css"> - > </head> <body> <form action = "oauthservlet" method = "post">注文番号:<入力タイプ= "text" name "name"/> <input Type = "shing" action = "scancodepayservlet?flag = createcode" method = "post">注文番号:<入力型= "text" name = "orderno"/> <入力タイプ= "balue =" bulation "/> </form> </body> </html> </html>
2 OAuthを介してコードを取得するためのサーブレットを書きます
パッケージcom.debug.weixin.servlet; java.io.ioexceptionをインポートします。 java.io.printwriterをインポートします。 javax.servlet.requestdispatcherをインポートします。 javax.servlet.servletexceptionをインポートします。 javax.servlet.http.httpservletをインポートします。 javax.servlet.http.httpservletrequestをインポートします。 javax.servlet.http.httpservletResponseをインポートします。 com.debug.weixin.util.commonutilをインポートします。 com.debug.weixin.util.serverconfigをインポートします。 public class oauthservletは、httpservletを拡張します{public void doget(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {this.dopost(request、response); } public void dopost(httpservletrequest request、httpservletResponse応答)throws servletexception、ioexception {string orderno = request.getparameter( "orderno"); // wechat oauth2.0を呼び出してOpenID文字列redirecturl = serverconfig.serverdomain+"/basicweixin/payservletforh5?orderno ="+orderno;文字列redirecturi = ""; try {redirecturi = commonutil.initopenid(redirecturl); } catch(例外e){// todo auto-enerated catch block e.printstacktrace(); } //system.out.println(Redirecturi); // requestdispatcher dis = request.getRequestDispatcher(redirecturi); //dis.forward(request、response); Response.sendredirect(redirecturi); }} 3コードを取得したら、redirecturiを介してOpenIDを取得し、統一された単一のインターフェイスを呼び出します
パッケージcom.debug.weixin.servlet; java.io.ioexceptionをインポートします。 java.io.printwriterをインポートします。 java.util.sortedMapをインポートします。 java.util.treemapをインポートします。 javax.servlet.requestdispatcherをインポートします。 javax.servlet.servletexceptionをインポートします。 javax.servlet.http.httpservletをインポートします。 javax.servlet.http.httpservletrequestをインポートします。 javax.servlet.http.httpservletResponseをインポートします。 com.debug.weixin.pojo.weixinoauth2tokenをインポートします。 com.debug.weixin.pojo.weixinqrcodeをインポートします。 com.debug.weixin.util.advencedutilをインポートします。 com.debug.weixin.util.commonutilをインポートします。 com.debug.weixin.util.configutilをインポートします。 com.debug.weixin.util.paycommonutilをインポートします。 public class payservletforh5は、httpservlet {public void doget(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {this.dopost(request、response); } public void dopost(httpservletrequest request、httpservletResponse応答)throws servletexception、ioexception {string orderno = request.getparameter( "orderno");文字列code = request.getParameter( "code"); // AccessToken weixinoauth2token token = advancedutil.getoauth2accestoken(configutil.appid、configutil.app_secrect、code); string openid = token.getopenid(); // wechat unified payment interface sortedmap <object、object> parameters = new Treemap <object、object>()を呼び出すparameters.put( "appid"、configutil.appid); parameters.put( "mch_id"、configutil.mch_id); parameters.put( "device_info"、 "1000"); parameters.put( "body"、 "My Test Orders"); parameters.put( "nonce_str"、paycommonutil.createnoncestr()); parameters.put( "out_trade_no"、orderno); //parameters.put("total_fee "、string.valueof(total)); parameters.put( "total_fee"、 "1"); parameters.put( "spbill_create_ip"、request.getRemoteaddr()); parameters.put( "notify_url"、configutil.notify_url); parameters.put( "trade_type"、 "jsapi"); parameters.put( "OpenID"、openID); string sign = paycommonutil.createsign( "utf-8"、パラメーター); parameters.put( "sign"、sign); string requestxml = paycommonutil.getRequestXml(パラメーター);文字列result = commonutil.httpsRequestForstr(configutil.unified_order_url、 "post"、requestxml); system.out.println( "-------------------------------"); system.out.println(result); system.out.println( "-------------------------------"); request.setattribute( "orderno"、orderno); request.setattribute( "totalprice"、 "0.01");文字列payjson = ""; try {payjson = commonutil.geth5paysstr(result、request); } catch(例外e){// todo auto-enerated catch block e.printstacktrace(); } //system.out.println(payjson); request.setattribute( "Unifidedorder"、Payjson); RequestDisPatcher dis = request.getRequestDispatcher( "h5pay.jsp"); Dis.Forward(リクエスト、応答); }} WeChatを呼び出して単一のインターフェイスを統合するには、署名アルゴリズムに注意が必要です。署名計算が正しい場合にのみ、支払いはスムーズになります
public static string geth5paysstr(string result、httpservletrequest request)スロー例外{map <string、string> map = xmlutil.doxmlparse(result); sortedmap <object、object> params = new Treemap <object、object>(); params.put( "appid"、configutil.appid); params.put( "Timestamp"、long.toString(new Date()。getTime())); params.put( "noncestr"、paycommonutil.createnoncestr()); params.put( "package"、 "prepay_id ="+map.get( "prepay_id")); params.put( "signtype"、configutil.sign_type); string paysign = paycommonutil.createsign( "utf-8"、params); params.put( "Paysign"、Paysign); //賃金の生成ルールは、符号文字列json = jsonobject.fromobject(params).toString()の生成ルールと一致しています。 jsonを返します。 } 4最終的な支払いインターフェイスを作成して、WeChat H5支払いを調整します
<%@ page Language = "java" import = "java.util。*" pageencoding = "utf-8"%> <%string path = request.getContextPath(); string basepath = request.getscheme()+"://"+request.getServername()+":"+request.getServerport()+path+"/"; %> <!doctype html public " - // w3c // dtd html 4.01 transitional // en"> <html> <head> <base href = "<%= basepath%>"> <title> wechat H5支払い</title> <meta name = "viewport =" type = "text/javascript"> function jsapicall(){weixinjsbridge.invoke( 'getBrandwcpayRequest'、<%=(string)request.getAttribute( "UnifiedOrder")%>、function(res){weixinjsbridge.log(res.err_msg); //alert(code+res.err_desc+res.err_msg); }関数callPay(){if(typeof weixinjsbridge == "undefined"){if(document.addeventlistener){document.addeventlistener( 'weixinjsbridgeready'、jsapicall、false); } else if(document.attachevent){document.attachevent( 'weixinjsbridgeready'、jsapicall); document.attachevent( 'onweixinjsbridgeready'、jsapicall); }} else {jsapicall(); }} </script> </head> <body> <入力タイプ= "button" value = "pay" onclick = "callpay()"/> </body> </html> 5。WECHAT支払い結果の通知を処理します
パッケージcom.debug.weixin.servlet; java.io.bytearrayoutputStreamをインポートします。 java.io.ioexceptionをインポートします。 java.io.inputStreamをインポートします。 java.io.printwriterをインポートします。 java.util.mapをインポートします。 javax.servlet.servletexceptionをインポートします。 javax.servlet.http.httpservletをインポートします。 javax.servlet.http.httpservletrequestをインポートします。 javax.servlet.http.httpservletResponseをインポートします。 org.jdom.jdomexceptionをインポートします。 com.debug.weixin.util.paycommonutilをインポートします。 com.debug.weixin.util.xmlutilをインポートします。 public class fayhandlerservletはhttpservlet {public void doget(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {this.dopost(request、response); } public void dopost(httpservletrequest request、httpservletResponse応答)servletexception、ioexception {inputstream instream = request.getinputStream(); bytearrayoutputStream outsteam = new bytearrayoutputStream(); byte [] buffer = new byte [1024]; int len = 0; while((len = instream.read(buffer))!= -1){outsteam.write(buffer、0、len); } outsteam.close(); instream.close(); string result = new String(outsteam.tobytearray()、 "utf-8"); // weChatの返された情報を取得しますnotify_url map <object、object> map = null; try {map = xmlutil.doxmlparse(result); } catch(jdomexception e){// todo auto-fenated catch block e.printstacktrace(); } for(object keyvalue:map.keyset()){system.out.println(keyvalue+"="+map.get(keyvalue)); } if(map.get( "result_code")。toString()。equalsignOrecase( "success")){//注文System.out.println( "------------------------------------ ok"); Response.getWriter()。write(paycommonutil.setxml( "success"、 "")); //メッセージを受け取ったことをWeChatサーバーに伝え、コールバックアクションを呼び出しないでください}}}上記のコードについては、それらの多くはhttp://blog.csdn.net/u011160656/article/details/41759195を参照しているため、コードのこの部分は投稿されません。必要な場合は、このブログを読むことでそれを知ることができます。
2。WeChatスキャンコードを支払う
キーポイント:短いリンクインターフェイスへの長いリンクを呼び出し、コールバックURLを支払うようにスキャンコードを正しく構成する必要があります
1注文番号に基づいてWeChat Payment QRコードを生成する
QRコードを生成する方法は次のとおりです。
パッケージcom.debug.weixin.util; com.google.zxing.common.bitmatrixをインポートします。 javax.imageio.imageioをインポートします。 java.io.fileをインポートします。 java.io.outputStreamをインポートします。 java.io.ioexceptionをインポートします。 java.awt.image.bufferedimageをインポートします。パブリックファイナルクラスmatrixtoimagewriter {private static final int black = 0xff000000;プライベート静的final int white = 0xfffffff; private matrixtoimagewriter(){} public static bufferedimage tobufferedimage(bitmatrix matrix){int width = matrix.getWidth(); int height = matrix.getheight(); bufferedimage image = new BufferedImage(幅、高さ、bufferedimage.type_int_rgb); for(int x = 0; x <width; x ++){for(int y = 0; y <height; y ++){image.setrgb(x、y、matrix.get(x、y)?black:white); }} return image; } public static void writetofile(bitmatrix matrix、string format、file file)throws ioexception {bufferedimage image = tobufferedimage(matrix); if(!imageio.write(image、format、file)){throw new ioexception( "format" + format + "to" + file); }} public static void writetostream(bitmatrix matrix、string format、outputstream stream)をスローIoexception {bufferedimage image = tobufferedimage(matrix); if(!imageio.write(image、format、stream)){throw new ioException( "フォーマットの画像を書くことができませんでした" + format); }}}これはツールクラスであり、インターフェイスにQRコードを表示する別の方法があります。 CreateQRCodeは主にコードブロックを使用します。
public static void createcodeStream(string text、httpservletResponse応答)スロー例外{// respons.setContentType( "Image/jpeg"); ServletOutputStream SOS = Response.GetOutputStream(); int width = 500; int height = 500; // QRコードイメージ形式文字列形式= "jpg"; multiformatwriter multiformatwriter = new multiformatwriter(); Map Hints = new Hashmap(); //エンコードされたHints.put(encodehinttype.character_set、 "utf-8"); BitMatrix BitMatrix = multiformatwriter.encode(text、barcodeformat.qr_code、width、height、hints); // QRコードMatrixToImageWriter.WriteToStream(BitMatrix、Format、SOS)を生成します。 sos.close(); } 2。長いリンクを短いリンクに変換してQRコードを生成するには、スキャンコード支払いコールバックメソッドを書き、統一された単一インターフェイスを呼び出します
パッケージcom.debug.weixin.servlet; java.io.bytearrayoutputStreamをインポートします。 java.io.ioexceptionをインポートします。 java.io.inputStreamをインポートします。 java.io.printwriterをインポートします。 Import Java.util.date; java.util.mapをインポートします。 java.util.sortedMapをインポートします。 java.util.treemapをインポートします。 javax.servlet.servletexceptionをインポートします。 javax.servlet.http.httpservletをインポートします。 javax.servlet.http.httpservletrequestをインポートします。 javax.servlet.http.httpservletResponseをインポートします。 org.jdom.jdomexceptionをインポートします。 com.debug.weixin.util.commonutilをインポートします。 com.debug.weixin.util.configutilをインポートします。 com.debug.weixin.util.createqrcodeをインポートします。 com.debug.weixin.util.paycommonutilをインポートします。 com.debug.weixin.util.xmlutilをインポートします。 com.mongodb.dbobjectをインポートします。パブリッククラスのscancodepayservletは、httpservletを拡張します{public void doget(httpservletrequest request、httpservletresponse応答)Servletexception、ioexception {this.dopost(request、response); } public void dopost(httpservletrequest request、httpservletresponse応答)throws servletexception、ioexception {string flag = request.getParameter( "flag"); if( "CreateCode" .equals(flag)){createPayCode(request、response); } else {try {wxscancodehandler(request、response); } catch(例外e){// todo auto-enerated catch block e.printstacktrace(); }}} public void createPayCode(httpservletrequest request、httpservletResponse応答){string orderno = request.getParameter( "orderno"); sortedmap <object、object> paras = new Treemap <object、object>(); paras.put( "appid"、configutil.appid); paras.put( "mch_id"、configutil.mch_id); paras.put( "time_stamp"、long.toString(new Date()。getTime())); paras.put( "nonce_str"、paycommonutil.createnoncestr()); paras.put( "product_id"、orderno); //製品番号は一意の文字列sign = paycommonutil.createsign( "utf-8"、paras)でなければなりません。 paras.put( "sign"、sign); string url = "weixin:// wxpay/bizpayurl?sign = sign&appid = appid&mch_id = mchid&product_id = productid&time_stamp = timestamp&nonce_str = nocestr"; string nativeurl = url.replace( "sign"、sign).replace( "appid"、configutil.applace( "mchid")、configutil.mch_id).replace( "productid"、(string)paras.get( "product_id")。 (string)paras.get( "nonce_str")); sortedmap <object、object> parameters = new Treemap <object、object>(); parameters.put( "appid"、configutil.appid); parameters.put( "mch_id"、configutil.mch_id); parameters.put( "nonce_str"、paycommonutil.createnoncestr()); parameters.put( "long_url"、commonutil.urlencodeutf8(nativeurl));文字列sign2 = paycommonutil.createsign( "utf-8"、パラメーター); parameters.put( "sign"、sign2); string requestxml = paycommonutil.getRequestXml(パラメーター); string result = commonutil.httpsRequestforstr(configutil.short_url、 "post"、requestxml); map <string、string> map = null; try {map = xmlutil.doxmlparse(result); } catch(jdomexception e){// todo auto-fenated catch block e.printstacktrace(); } catch(ioException e){// todo auto-fenated catch block e.printstacktrace(); } string returncode = map.get( "return_code"); string resultCode = map.get( "result_code"); if(returnCode.EqualSignOreCase( "success")&& resultCode.equalsignOrecase( "success")){string shorturl = map.get( "short_url"); // todo shorturlを取得し、qr code system.out.println( "shorturl ="+shorturl)を生成するコードを書き込みます。 try {createqrcode.createCodestream(shorturl、response); } catch(例外e){// todo auto-enerated catch block e.printstacktrace(); }}} public void wxscancodehandler(httpservletrequest request、httpservletresponse応答)スロー例外{inputstream instream = request.getinputstream(); bytearrayoutputStream outsteam = new bytearrayoutputStream(); byte [] buffer = new byte [1024]; int len = 0; while((len = instream.read(buffer))!= -1){outsteam.write(buffer、0、len); } outsteam.close(); instream.close(); string result = new String(outsteam.tobytearray()、 "utf-8"); // weChatの返された情報を取得しますnotify_url map <object、object> map = null; try {map = xmlutil.doxmlparse(result); } catch(jdomexception e){// todo auto-fenated catch block e.printstacktrace(); } for(object keyvalue:map.keyset()){system.out.println(keyvalue+"="+map.get(keyvalue)); } string orderno = map.get( "product_id")。toString(); //リクエストパラメーターを受信したら、Unified Single Interface sortedMap <object、object> parameters = new treemap <object、object>()を呼び出します。 parameters.put( "appid"、configutil.appid); parameters.put( "mch_id"、configutil.mch_id); parameters.put( "device_info"、 "1000"); parameters.put( "body"、 "注文へのテストコード"); parameters.put( "nonce_str"、paycommonutil.createnoncestr()); parameters.put( "out_trade_no"、map.get( "product_id")); //parameters.put("total_fee "、string.valueof(totalprice)); parameters.put( "total_fee"、 "1"); parameters.put( "spbill_create_ip"、request.getRemoteaddr()); parameters.put( "notify_url"、configutil.notify_url); parameters.put( "trade_type"、 "native"); parameters.put( "openID"、map.get( "openid")); string sign = paycommonutil.createsign( "utf-8"、パラメーター); parameters.put( "sign"、sign); string requestxml = paycommonutil.getRequestXml(パラメーター); string result2 = commonutil.httpsRequestForstr(configutil.unified_order_url、 "post"、requestxml); system.out.println( "-------------------------------- --------------------------"); System.out.println(result2); map <string、string> mm = null; {mm = geth5paymap(result2、request); } catch(例外e){// todo auto-enerated catch block e.printstacktrace(); } // string prepayid = getPrepayid(result2、request); // string returnnonestr = getreturnnonestr(result2、request); string prepayid = mm.get( "prepay_id"); string returnnonestr = mm.get( "nonce_str");; sortedMap <object、object> lastSign = new Treemap <object、object>(); lastSign.put( "return_code"、 "success"); lastSign.put( "appid"、configutil.appid); lastSign.put( "mch_id"、configutil.mch_id); lastSign.put( "nonce_str"、returnnonestr); lastSign.put( "prepay_id"、prepayid); lastSign.put( "result_code"、 "success"); lastSign.put( "key"、configutil.api_key); string lastsignpara = paycommonutil.createsign( "utf-8"、lastSign); stringbuffer buf = new StringBuffer(); buf.append( "<xml>"); buf.append( "<treturn_code> success </return_code>"); buf.Append( "<Appid>"+configutil.appid+"</appid>"); buf.append( "<mch_id>"+configutil.mch_id+"</mch_id>"); buf.append( "<mch_id>"+configutil.mch_id+"</mch_id>"); buf.append( "<nonce_str>"+returnnonestr+"</nonce_str>"); buf.append( "<prepay_id>"+prepayid+"</prepay_id>"); buf.append( "<sults_code> success </result_code>"); buf.append( "<sign>"+lastSignpara+"</sign>"); buf.append( "</xml>"); Response.getWriter()。print(buf.toString()); } public Map <string、string> geth5paymap(string result、httpservletrequest request)throws {map <string、string> map = xmlutil.doxmlparse(result);マップを返します。 }}最後に、公式アカウントの支払いのためにWeChat構成を見て、コードの支払いをスキャンしましょう。
この記事を通して、GitHubが提供する不正行為コードを使用せずにWeChat PublicアカウントとWeChatの支払いを行うためにJavaを使用しても、あなたとあなたの顧客を満足させるWeChatアプリケーションを開発できることを誰もが理解できることを願っています。 WeChatによって与えられたデモはすべてPHPですが、これらはすべてクラウドです。開発言語は2番目であり、インターフェイスコールが必要とする基礎となるレイヤーを理解することは、プログラマーにとって義務的なコースにすぎません。