このセクションでは、最初にYibao支払いプロセスをテストするための簡単なデモを書きます。このプロセスに精通した後、実際の開発を行います。それはデモであるため、いくつかのデザインパターンを考慮しませんでしたが、支払い関数を直接実装しました。支払い関数を実装するには、Yibaoは当社に提供されるAPIを要求します。したがって、問題は、サードパーティの支払いプラットフォームを使用する際の最も重要なことは、プラットフォームのAPIを取得することです。最初に彼らのAPIと開発文書を取得する必要があり、次にさらに開発を行うことができます。
1. YibaoのAPIを取得します
APIを取得するための最初のステップは、Yibaoにアカウントを登録することです。このアカウントは商人のアカウントです。買い手が支払った後、彼はお金を口座に預け、商人はそれを自分で銀行カードに引き出します。 Yibaoは、撤退プロセス中に特定の処理料を請求します。これはYibaoの利益モデルです。ただし、登録を成功させるための前提条件は、Webサイト、または会社、Bara、Baraなどが必要であることです。とにかく、申請する資格が必要です。 Yibaoはこの点をレビューします。会ったときにのみ、インターフェイスを登録して提供することができます。誰もが登録できるわけではありません。私はそれを使用し、他の人は登録しましたが、私は何も持っていませんでした...私は登録できませんでした...私はこれを知っていますが、一般的に会社で開発するとき、この問題はありません。アカウントが必要です。最も重要なことは、開発プロセスと関連技術を習得することです。
2。支払いプロセスをテストします
公式のAPIおよび技術文書を使用すると、開発を開始できます。ここでは、主にYibao支払いのプロセスをテストするための簡単なデモを書きます。デモの構造は非常にシンプルで、サーブレット、フィルター、2つのJSPページ、暗号化されたツールクラスです。サーブレットはYibao Server側を扱います。 Yibaoインターフェイスに関連するいくつかの処理を行います。フィルターは、可能な中国の文字化けの問題に対処するために使用されます。 2つのJSPの1つは、フロントエンドページです。
以下に示すように、まず支払い要求プロセスを分析しましょう。
わかりました、デモの関連コードを詳細に分析しましょう。
2.1フロントデスクテストページ
まず、フロントデスクページindex.jspの特定のコードを見てみましょう
<%@ page Language = "Java" PageEncoding = "UTF-8"%> < action = "$ {pagecontext.request.contextpath}/servlet/payservlet" method = "post">このショッピングの注文番号<入力タイプ= "Text" name "name =" p2_order "/> <br> money <input" name "name" name = "p3_amt" value = "0.01"/> name = "pd_frpid"> Construction Bank <入力タイプ= "Radio" value = "ccb-net" name = "pd_frpid"> <br> <input Type = "submit" value = "submit"/> <input type = "hidden" value = "pay"/> </form> </body> </body> </html> <上記のJSPページから、これらの入力タグの名前属性値が非常に奇妙で、pi_function(i = 0,1,2、…、9)であり、もちろん他の値があることがわかります。これには、Yibaoの公式文書を参照する必要があります。これらの名前は、対応する属性を表し、処理のためにセブレットに渡されます。これらの属性値については、次のような写真があります。
これらのパラメーター名の一部は、上記の注文番号など、実際のプロジェクトでフロントデスクから送信されます。他のパラメーターが必要な場合は、サーブレットで指定する必要があります。フィールドが不要な場合は、空になる可能性があります。ここの空はヌルではなく、「」であり、後でサーブレットで言及されます。
2つの銀行の対応する値の値を見てみましょう。 Yibaoは、サポートするすべての銀行の価値価値を提供します。これらは固定されており、変更できません。効果をテストするための2つの銀行を次に示します。
最後の隠しフィールドは、サーブレットで判断を下すために使用されます。支払いが成功した後の支払いであろうと返品であろうと、以下のセブレットで説明されます。
2.2サーブレットハンドルリクエスト
サーブレットは、主に関連リクエストをYibaoに処理します。コンテンツには2つの部分があります。 1つの部分は、プレーンテキストと暗号テキストをYibaoに送信することであり、もう1つの部分は、Yibaoが送信したプレーンテキストと暗号テキストを判断することです。デモの特定の実装コードを見てみましょう。
パブリッククラスPayServletはhttpservletを拡張します{public void doget(httpservletrequest request、httpservletresponse応答)throws servletexception、ioexception {string status = request.getParameter( "status"); if(status.equals( "pay")){// index.jspの非表示フィールドが支払われるため、支払い部品は処理されます//暗号化キーは暗号化アルゴリズムで使用され、支払い仲介者によって提供されます。各販売者には一意の文字列keyvalue = "w0p75wmz203fr46r5i70v556whfa94j14yw5j6vuh4yo3nrl5jsqf3c41677"; // 1:パラメーターに値を割り当てます。これらのパラメーター(つまり、プレーンテキスト)は、Yibaoが提供するドキュメントで定義されています。名前文字列p0_cmd = formattring( "buy")を変更することはできません。文字列P1_MERID = FORMATSTRING( "10000940764"); String P2_ORDER = FORMATSTRING(request.getParameter( "p2_order")); string p3_amt = formattring(request.getParameter( "p3_amt"));文字列p4_cur = formattring( "cny");文字列p5_pid = "";文字列p6_pcat = "";文字列p7_pdesc = "";文字列P8_url = "http://www.tongji.edu.cn"; //これは、支払い後にジャンプするページです。モールのホームページとして設定できます。このデモでは、Tongji University Homepage ... String P9_Saf = "0"を使用するのに十分です。文字列pa_mp = ""; string pd_frpid = formattring(request.getParameter( "pd_frpid")); pd_frpid = pd_frpid.touppercase();文字列pr_needResponse = "0"; string hmac = formattring( ""); // HMACはciphertextの保存に使用されます/*上記のすべてのプレーンテキストは、フォーマットストリング方法で包まれています。メソッドは主にnullを「 *」に変換するため、nullをciphertextに変換できないため *//データセキュリティの問題を解決するため:プレーンテキスト---> ciphertextを暗号化し、yibaoにyibaoに渡します// yibaoがデータを取得した後、トランスマイテテキストを取得した後、cyphetextextextextextextextextextextextextextextextextexを取得しました。改ざん(商人とYibaoは両方とも暗号化するときに同じキーを使用します) // Yibaoは文書の注文に従って追加されているため、Yibaoの公式文書の名前に従って厳密に書く必要があります。 infobuffer = new StringBuffer(); infobuffer.append(p0_cmd); infobuffer.append(p1_merid); infobuffer.append(p2_order); infobuffer.append(p3_amt); infobuffer.append(p4_cur); infobuffer.append(p5_pid); infobuffer.append(p6_pcat); infobuffer.append(p7_pdesc); infobuffer.append(p8_url); infobuffer.append(p9_saf); infobuffer.append(pa_mp); infobuffer.append(pd_frpid); infobuffer.append(pr_needResponse); //暗号化された暗号文はHMACに保存され、暗号化アルゴリズムyibaoはそれを提供します。 // request.setattribute request.setattribute( "p0_cmd"、p0_cmd)に、プレーンテキストと暗号テキストの両方をリクエストに保存します。 request.setattribute( "p1_merid"、p1_merid); request.setattribute( "p2_order"、p2_order); request.setattribute( "p3_amt"、p3_amt); request.setattribute( "p4_cur"、p4_cur); request.setattribute( "p5_pid"、p5_pid); request.setattribute( "p6_pcat"、p6_pcat); request.setattribute( "p7_pdesc"、p7_pdesc); request.setattribute( "p8_url"、p8_url); request.setattribute( "P9_SAF"、P9_SAF); request.setattribute( "pa_mp"、pa_mp); request.setattribute( "pd_frpid"、pd_frpid); request.setattribute( "pr_needResponse"、pr_needResponse); request.setattribute( "hmac"、hmac); system.out.println( "hmac->" + hmac); // reqpay.jspにスキップし、この情報をyibao request.getRequestDispatcher( "/reqpay.jsp")。 } else if(status.equals( "success")){// yibaoから来ているのは成功です。 string keyvalue = "w0p75wmz203fr46r5i70v556whfa94j14yw5j6vuh4yo3nrl5jsqf3c41677"; //すべてPLANTEXT STRING R0_CMD = FORMATSTRING(request.getParameter( "R0_CMD"));文字列p1_merid = request.getParameter( "p1_merid"); string r1_code = formattring(request.getParameter( "r1_code")); string r2_trxid = formattring(request.getParameter( "r2_trxid")); string r3_amt = formattring(request.getParameter( "r3_amt")); string r4_cur = formattring(request.getParameter( "r4_cur")); string r5_pid = new String(formattring(request.getParameter( "r5_pid"))。 string r6_order = formattring(request.getParameter( "r6_order")); string r7_uid = formattring(request.getParameter( "r7_uid")); string r8_mp = new String(formattring(request.getParameter( "r8_mp"))。 string r9_btype = formattring(request.getParameter( "r9_btype")); // plantext string hmac = formattring(request.getParameter( "hmac"))にデータを追加します。 stringbuffer infobuffer = new StringBuffer(); infobuffer.append(p1_merid); infobuffer.append(r0_cmd); infobuffer.append(r1_code); infobuffer.append(r2_trxid); infobuffer.append(r3_amt); infobuffer.append(r4_cur); infobuffer.append(r5_pid); infobuffer.append(r6_order); infobuffer.append(r7_uid); infobuffer.append(r8_mp); infobuffer.append(r9_btype); //返されたプレーンテキスト文字列md5 = digestutil.hmacsign(infobuffer.tostring()、keyvalue)を暗号化する; //暗号化された暗号文が送信されたデータシグネチャブールのISOK = MD5.Equals(HMAC)に等しいかどうかを判断します。 if(isok && r1_code.equals( "1")){// r1_codeは成功を示すために1です//成功した注文ステータスを有料に変更し、電子メールサービスインターフェイス、SMS送信サービスなどを呼び出す// } else {out.println( "fail !!!"); }}} public void dopost(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {doget(request、response); } string formattring(string text){if(text == null){return ""; }テキストを返します。 }}2.3暗号化アルゴリズム
プレーンテキストを暗号文に変換するために使用される暗号化アルゴリズムは、Yibaoによって提供されます。プレーンテキストを暗号文に変換するために使用するだけです。アルゴリズムは次のとおりです。
public class digestutil {private static string encodingcharset = "utf-8"; public static string hmacsign(string avalue、string akey){byte k_ipad [] = new byte [64]; byte k_opad [] = new byte [64];バイトkeyb [];バイト値[]; try {keyb = akey.getBytes(encodingcharset); value = avalue.getBytes(encodingcharset); } catch(unsupportedencodingexception e){keyb = akey.getBytes(); value = avalue.getBytes(); } arrays.fill(k_ipad、keyb.length、64、(byte)54); arrays.fill(k_opad、keyb.length、64、(byte)92); for(int i = 0; i <keyb.length; i ++){k_ipad [i] =(byte)(keyb [i] ^ 0x36); k_opad [i] =(byte)(keyb [i] ^ 0x5c); } MESSAGEDGEST MD = null; try {md = mesagedigest.getInstance( "md5"); } catch(nosuchalgorithmexception e){return null; } md.update(k_ipad); md.update(value); byte dg [] = md.digest(); md.reset(); md.update(k_opad); md.update(dg、0、16); dg = md.digest(); return tohex(dg); } public static string tohex(byte input []){if(input == null)return null; stringbuffer output = new StringBuffer(input.length * 2); for(int i = 0; i <input.length; i ++){int current = input [i]&0xff; if(current <16)output.append( "0"); output.append(integer.toString(current、16)); } return output.toString(); } public static string gethmac(string [] args、string key){if(args == null || args.length == 0){return(null); } stringbuffer str = new StringBuffer(); for(int i = 0; i <args.length; i ++){str.append(args [i]); } return(hmacsign(str.toString()、key)); } / ** * @param avalue * @return * / public static string digest(string avalue){avalue = avalue.trim();バイト値[]; try {value = avalue.getBytes(encodingcharset); } catch(unsupportedencodingexception e){value = avalue.getBytes(); } MESSAGEDGEST MD = null; try {md = mesagedigest.getInstance( "sha"); } catch(nosuchalgorithmexception e){e.printstacktrace(); nullを返します。 } return tohex(md.digest(value)); } // public static void main(string [] args){//パラメーター1:plantext(暗号化されるデータ)パラメーター2:key system.out.println(digestutil.hmacsign( "11111"、 "abc")); System.out.println(digestutil.hmacsign( "11111"、 "abd")); //データセキュリティの問題を解決する:プレーンテキストを暗号化する---> secretテキストとプレーンテキストはyibaoに// yibaoがデータを取得し、送信されたプレーンテキストを暗号化し、送信された暗号テキストと比較します。平等なデータが改ざんされていない場合(商人とYibaoは両方とも暗号化するときに同じキーを使用します)}}暗号化アルゴリズムをあまり研究していません。これは、第2世代のMD5暗号化アルゴリズムのようです。とにかく、その中にプレーンテキストを投げるだけで、間違いなく暗号化されます。 reqpay.jspページを見てみましょう。
<%@ページ言語= "java" contentType = "text/html; charset = gbk"%> <html> <head> <title> to yeepayページtype = 'hidden' name = 'p0_cmd' value = '$ {requestscope.p0_cmd}'> <入力タイプ= '非表示' name = 'p1_merid' value = '$ {requestscope.p1_merid}' name = 'p3_amt' value = '$ {requestscope.p3_amt}'> <入力タイプ= 'hidden' name = 'p4_cur' value = '$ {requestscope.p4_cur}'> <inputタイプ= 'name =' p5_pid 'value =' $ {requestscope.p5_pid} '> <入力タイプ=' p6_pct 'p6_pct'> value = '$ {requestscope.p6_pcat}'> <入力タイプ= 'hidden' name = 'p7_pdesc' value = '$ {requestscope.p7_pdesc}'> <入力タイプ= 'name =' p8_url 'value =' $ {requestscope.p8_url} value = '$ {requestscope.p9_saf}'> <入力タイプ= 'hidden' name = 'pa_mp' value = '$ {requestscope.pa_mp}'> <入力タイプ= '非表示' name = 'pa_mp' value = '$ {requestscope.pa_mp}'> value = '$ {requestscope.pa_mp}'> <入力タイプ= 'hidden' name = 'pd_frpid' value = '$ {requestscope.pd_frpid}'> <入力タイプ= "hidden" name = "pr_needresponse" value = "$ {requestscope.pr_needResponse} value = '$ {requestscope.hmac}'> <入力タイプ= '送信'/> </form> </body> </html>実際、このページは非常に簡単です。プレーンテキストと暗号テキストを<form>フォームを介してYibaoに渡すことです。 Yibaoの受信URLはhttps://www.yeepay.com/app-merchant-proxy/nodeです。これはYibaoの役人によっても提供されており、これを書くことができます。実際、 submitボタンのみがあります。 submitボタンをクリックして、プレーンテキストと暗号テキストを送信します。テスト結果を見てみましょう。
3。支払い結果をテストします
簡単なテストフロントデスクindex.jsp ~~~:
送信後、ReqpayとJSPにアクセスします。 [送信]ボタンをクリックした後の効果は次のとおりです。 ICBCとCCBの両方をテストします。
支払いプロセスに問題はありません。私はもともと、支払いが完了した後の結果を見るためにICBCに1セントを支払うことを計画していましたが、U-ShieldがAlipayを使用する方が便利であることがわかりました... U-Shieldを更新しませんでしたが、ICBCを介して電子ペイメントを開きましたが、上記のインターフェースで電子ペイメントを使用することもできます。
その後、以前に指定したページ、つまりTongji Universityにジャンプします...わかりました、テストが完了し、支払いプロセス全体が終了しました!
このセクションでは、主に簡単なデモを介してテストして、銀行の支払いインターフェイスに接続できるかどうかを確認します。これでテストは問題なく、接続されており、後でいつものように支払うことができます。簡単なデモを紹介しましょう。その後、以前のオンラインモールプロジェクトのオンライン支払いモジュールの開発を続けます。
元のアドレス:http://blog.csdn.net/eson_15/article/details/51447492
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。