1:早期のWechat支払いリテラシーの知識
前提条件は、WeChatの支払い機能に適用されている公式アカウントがすでにあることです。その後、公式アカウントAppIDおよびWeChat Merchantアカウントを取得する必要があります。これは、それぞれWeChatの公式アカウントとWeChat Payment Merchantプラットフォームに記載されています。実際、支払い機能を正常に申請した後、WeChatはメールでメールを転送します。この情報を使用して、WeChat Payment Serviceサポートページにアクセスできます:https://pay.weixin.qq.com/service_provider/index.shtml
このページを開き、右上隅のリンク[開発文書]をクリックして、APIドキュメントの説明ページに入ります。
Red Circleを選択して、コードをスキャンして支払います。つまり、アクセス方法を実行する必要があります。マウスを上記に移動し、開発ドキュメントを表示するように求めます。これを見る方法がわからない場合は、シャワーを浴びて寝ることができます。あなたは本当にプログラマに適していません。アドレスは次のとおりです。
https://pay.weixin.qc.com/wiki/doc/api/native.php?chapter=6_1ブラウザで開いた後に表示されます
私たちが焦点を合わせて読むコンテンツは、すでに赤い楕円でマークされています。まず、[インターフェイスルール]のプロトコル仕様をお読みください。冗談です。これを読んでいない場合は、WeChatの支払いをしたいです。これはあなたが女の子を拾いたいようなものです。最初にいくつかの基本的な背景情報を収集し、相手の特性を理解する必要があります。そうしないと、以下でどのようにコミュニケーションできますか。女の子を拾うことができるプログラマーだけが良いセールスマンであることがわかります。トピックから外れた後、[シーンの紹介]のケースと仕様を調べます。 Wechat Payのロゴを見てください。これは、最終的に自分のQRコード決済Webページに載せることです。これはより専門的に見えます。その後、[モード2]に焦点を当てます
ここでは、Mode 2メソッドを使用して、PCページのスキャンコード支払い関数を実現します。
WeChatによるモード2の公式説明は次のとおりです。「Merchant Backendシステムは、最初にWeChat Payの統一された単一インターフェイスを呼び出し、WeChat BackEndシステムはリンクパラメーターCode_urlを返し、Merchant Backendシステムはcode_url値でQRコード画像を生成し、ユーザーはコードコードクライアントとコードを開始します。理解した場合は、まずweChatに電話して統一された単一のインターフェイスを提供し、キー情報code_url(このcode_urlとは何かについてはわかりません)を取得する必要があります。次に、独自のプログラムを通じてQRコードを生成します。ここでは、GoogleのZxingライブラリを使用しています。次に、PC WebページにQRコードを表示するだけです。このようにして、ターミナルユーザーはコードをスキャンして支払い、支払いが完了します。あなたはこれを見てとても興奮しているに違いありません。 WeChatの支払いはとても簡単だと思います。まだ知らない別のことがあります。顧客は支払ったことを知っていますが、私たちのサーバー側はまだ知りません。 WeChat開発者のIQを使用すると、彼らはこの問題を長い間考えてきました。したがって、統合された単一のインターフェイスを呼び出すと、コールバックURLである必要なパラメーターがあります。つまり、クライアントが正常に支払うと、WeChatはこのURLを介して自分のサーバーにデータを送信し、その後、バックグラウンドでデータを解析して、独自の操作を完了します。そうして初めて、顧客がWeChatを通じて本当に支払ったかどうかを知ることができます。このようにして、プロセス全体が終了し、これはパターン2です。WeChatはタイミング図を使用してこのプロセスを表します。
表現するのは複雑で、難しいようです。要約すると、サーバーがすべきことは次のとおりです。
1.正しいパラメーター(もちろん、コールバックURL)と署名検証を統一された単一インターフェイスを介して渡し、返されたデータからcode_urlの対応するデータを取得します。
2。Code_URLデータに基づいて、QRコードイメージを生成し、ブラウザWebページに表示します。
3.コールバックのURLに独自のビジネスロジック処理を追加します。
リテラシーは現在終了しており、コードをスキャンすることで支払うプロセスの種類を最終的に知っています。関連するAPI使用量を見て、すべてのステップを処理するのに適した仕事をしましょう。
2:開発プロセス
コードを開発する前に、最初にいくつかのことを準備してください。
1. ZxingのMaven依存関係を追加します
2. JDOMのMaven依存関係を追加します
3.JavaバージョンSDKデモプログラムをダウンロードすると、アドレスはこちら
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1
md5util.javaとxmlutil.javaが2つのファイルが必要です
4. httpclientバージョン4.5.1を使用して、maven依存関係を追加することを忘れないでください
上記の準備が完了したら、続行し続けます。
まず、WeChatの統一されたシングルインターフェイスを呼び出す必要があります。 [APIリスト]の統一シングルをクリックすると、次のようなページが表示されます。
私の呼び出しの実際の状況を例にとると、次のパラメーターが必要です。みんなの便利さのために、私はそれをPojoオブジェクトに変えました。コードは次のとおりです。
public class UnifiedorderDto implements WeiXinConstants {private String appid;private String body;private String device_info;private String mch_id;private String nonce_str;private String notify_url;private String openId;private String out_trade_no;private String spbill_create_ip;private int total_fee;private String trade_type;private String product_id;private String sign;public UnifiedorderDto() {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 getid(){return appid;} public void appid( appid;} public string getbody(){return body;} public void setbody(string body){this.body = body;} public string getdevice_info(){return device_info;} public void setdevice_info(string device_info){this.device_info = device_info;} public string( 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;} public string getnotify_url() 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 out_no;} 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_pbill_ip_ip_ip_ip_ip gettotal_fee(){return 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 terrad_type = public_tigg = trade_type(} trade_type( {return sign;} public void setSign(string sign){this.sign = sign;} 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>" + "</appid>" + "" + this.body + "" + "<device_info> web </device_info>" + "<mch_id>" + this.mch_id + "</mch_id>" + "<nonce_str>" + this.nonce_str + "</nonce_str>" "</notify_url>" + "<out_trade_no>" + this.out_trade_no + "</out_trade_no>" + "<product_id>" + this.product_id + "</product_id>" + "<spbill_create_ip>" + this.spbill_create_ip + "/spbyl_ip +" </spbyl_ip + + "<total_fee>" + string.valueof(this.total_fee) + "</total_fee>" + "<trade_type>" + this.trade_type + "</trade_type>" + "<sign>" + this.sign + "</sign>" + "</xml this.appid + "&body =" + this.body + "&device_info = web" + "&mch_id =" + this.mch_id + "&nonce_str =" + this.nonce_str + "?ify_url =" + this.notify_url + "&out_trade_no =" "&spbill_create_ip =" + this.spbill_create_ip + "&total_fee =" + string.valueof(this.total_fee) + "&trade_type =" + this.trade_Type; "utf-8"); return signature.touppercase();}}各メンバー変数の説明は、[統一された単一インターフェイス]の説明に記載されています。
この後、設定したコンテンツに入力し、インターフェイスを呼び出して返品データを取得し、code_URLデータを取得し、それに基づいて2次元画像を生成し、画像アドレスをPC Webページに返すと表示されます。ここでは、WeChatの支払いをクリックすると、Ajaxメソッドを使用して独自のバックエンドSpringMVCコントローラーに電話し、コントローラーの対応するメソッドを介してWeChatの統一された単一インターフェイス分析を完了して、code_URLによって返されるXMLデータを取得し、QRコードを生成します。コントローラーに実装されているコードは次のとおりです。
map <string、object> result = new Hashmap <string、object>(); unifidedorderdto dto = new unifidordordto(); if(cash == null || "" .equals(cash){result.put( "error"、 "cash can zero"); return result;} int totalfee = 100*integer.parsint(cash); Totalfee); dto.setProduct_id(String.ValueOf(System.CurrentTimemillis())); dto.setBody( "Repair"); dto.setnonce_str(String.ValueOf(System.Nanotime());フラグDTO.SETOUT_TRADE_NO( "注文番号 +キー情報、WeChat Callbackの後に送信されます。 dto.makesign()); logger.info( "xml content:" + dto.generatexmlcontent()); try {httpclient httpclient = httpclientbuilder.create()。build(); httppost post = new httppost(weixinconstants.unifidedorder_url); post.addheader( "content-type"、 "text/xml; charset = utf-8"); sringentity xmlentity = new Stringentity(dto.generatexmlcontent()、 contentType.text_xml); post.setEntity(xmlentity); httpresponse httppresponse = httpclient.execute(post); string responsexml = entityutils.tostring(httpresponse.getentity()、 "utf-8"); logger.info code_url contentmap <string、string = ""> resultmap =(map <string、string = "">)xmlutil.doxmlparse(responsexml); logger.info( "respons code_url:" + resultmap.get( "code_url"); string codeurl = resultmap.get(code_url ");" code_url "); ! ""。equals(codurl)){string yimageurl = generateqrcode(codeurl); result.put( "qrimage"、yagenurl);} post.releaseconnection();} catch(excepse e){e.printstacktrace();} result.put( "success")、 "1"); result; </string、> </string、> </string、object> </string、object>QRコードを生成するコードは次のとおりです。
private string generateqrcode(string codeurl){file folder = new file(basepath + "qrcode"); if(!foldler.exists()){foldler.mkdirs();} string f_name = uuidutil.uuid() + ".png"; try {file f = new file(basepath + "qutcode" fio = new fileoutputStream(f); multiformatwriter multiformatwriter = new multiformatwriter(); map hints = new hashmap(); hints.put(encodehinttype.character_set、 "utf-8"); //文字セットの設定エンコードタイプビットマトリックスビットマトリックス= null; bitmatrix = multiformatwriter.encode(codeurl、barcodeformat.qr_code、300、300、hints); bufferedimage image = tobufferedimage(bitmatrix); ( "qrcode/" + f_name);} catch(Exception e1){e1.printstacktrace(); return null;}}}この時点で、クライアントのWeChat QRコードをスキャンした後、コールバックを使用してURLを作成し、データを返します。コールバックメソッドで独自の処理を完了します。ここで、コールバックインターフェイスをHTTP Postメソッドを介して実装する必要があることに注意することが重要です。そうしないと、XMLデータは受け入れられません。コールバック処理のコードは次のとおりです。
@RequestMapping(value = "/your_callback_url"、method = requestmethod.post)@responsebody public void finantpayment(httpservletrequest request、httpservletresponse応答){try {logger.info( "weixin server:" + request.getremotehost = " + request." new hashmap <string、string = "">(); inputstream inputstream = request.getInputStream(); //入力ストリームsaxbuilder saxbuilder = new saxbuilder(); document document = saxbuilder.build.build(inputstream); root.getChildren(); iterator it = list.iterator(); while(it.hasnext()){element e =(element)it.next(); string k = e.getname(); string v = ""; list children = e.getChildren(); if(chiller.isempty()){v = e.getTextnormalize(); xmlutil.getChildRentext(children);} resultMap.put(k、v);} //署名を確認します! ! ! /*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 ")=" " if(i = "=" 0)= "" kvparams = "" + = "(keys [i]" "=" + resultmap.get(keys [i]));} weixinpaymentutil.md5encode(esign、 "utf-8"); = "" if(!md5esign.equals(resultmap.get( "sign"))= "return; =" "}*=" returncode resultmap.get( "return_code"); "resultmap.get(out_trade_no"); outtradeno); = "" logger.info( "total_fee =" "nfee); =" "business processing process =" "if(" success ".equals(returncode))=" "todo:=" "your =" "business =" "process =" add = "" here = "" respons.getWriter()。print(xmlutil.getResultxml(resultMap.get( "return_code")、= "" resultmap.get( "return_code")); = "" else = "" resultmap.get( "return_msg")); = "" catch = "" ioe) " (jdomexception = "" e1)= "" e1.printstacktrace(); = ""}WeChat Demoの公式Javaバージョンで使用されているXmlutilとMd5utilの2つのクラスを使用することを忘れないでください。デモコードは、公式のデモページにあります。関連するメイブン依存関係は次のとおりです。
<Dependency> <GroupId> JDOM </groupId> jdom </artifactid> <version> 1.1 </version> </dependency> <dependency> <segrougid> com.google.zxing </groupid> core </artifactid> <バージョン
最後に、署名に特別な注意を払う必要があります。署名を取得するために、公式のWechat WebサイトからDEMOプログラムのJavaバージョンを直接ダウンロードしました。これは、MD5の署名が一貫していることを確認するための最良の選択であるため、同じことをすることをお勧めします。署名を生成するための特定のアルゴリズムについては、公式のWeChatドキュメントを表示できます。ここでは、公式のAPIを説明する必要があることを強くお勧めします。開発で遭遇するさまざまな問題の90%は、公式文書を読んでおらず、誰かのブログを信頼するためです!これは、この記事を書くことの本当の目的と目的です。公式文書によると、Javaコードで実装しました。 Wechat PC WebページでQRコードをスキャンし、支払いの支払いは間違いなくWebアプリケーションで飛行します。
上記は、編集者が導入したPC WebページWechat QRコード支払い(フルバージョン)のJava SpringMVC実装です。私はそれが誰にでも役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は、すべての人に時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!