1.オンライン支払いの概要
オンライン支払いとは何ですか?そうです、それはただオンラインでお金を使うだけです!誰もがそのような経験をしたに違いありません。しかし、あなたはオンライン支払いの「内側の物語」についてあまり知らないかもしれません。以下でそれについて学びましょう!
今すぐeコマースWebサイトの実行を開始した場合、ユーザーは何かを購入した場合に支払う必要があります。あなたのウェブサイトは主要な銀行に接続できる必要があります。その後、支払いが完了した後、Webサイトに戻り、「支払いの成功」を表示します!
これが私たちが今日やろうとしていることです。銀行のオンラインバンキングシステムに接続して、支払いを完了します。より専門的になるために、私たちはそれを「オンライン支払いのためのゲートウェイの開発」と呼びます
2。オンラインで支払う2つの方法
オンラインで支払うには2つの方法があります。
*eコマースは銀行と直接接続します
*eコマースは、サードパーティの支払いプラットフォームを通じて銀行とつながります
eコマースは銀行の同意を必要とする銀行と直接つながりますが、残念ながら、銀行は非常に「素晴らしい」ものであり、彼らとつながりたい人はいません。 eコマース事業に毎日の資本流が大きい場合、顧客がeコマースに支払うすべてのお金が銀行口座に預けられているため、銀行はあなたとつながります!しかし、資本の流れが小さい場合、銀行はあなたに注意を払わないでしょう!
小さなウェブサイトの資金が不十分で、銀行とつながることができない場合、彼らはサードパーティの支払い会社と協力することを選択します。また、Alipay、Yibao、Fortune、Kuaiqian、その他の企業など、これが中国で比較的有名な企業が何であるかを誰もが理解しています。これらの企業は(十分な資金があるため)銀行とつながることができ、その後、小規模のeコマース企業がそれらとつながることができます!しかし、第三者は料金が必要です!第三者は通常、電子商取引料の1%を請求しますが、顧客のお金を請求しません。
上記の写真を通して、モール名、RMBの注文番号、および注文時間が銀行のページに表示されることを知ることができます。 。 。 、銀行はこれらのことをどのように知っていますか?もちろん、eコマースによって銀行に渡されます。電子商取引会社が銀行とつながると、eコマース会社は銀行ページで必要なパラメーターを銀行ページに渡す必要があるため、銀行ページにこれらのデータを表示できます。
ただし、モールは1つの銀行にのみ接続することはできません。 BOC、CCB、ABC、ICBCの4つの会社とつながる必要があります。さまざまな銀行に必要なドッキングパラメーターは異なります。つまり、開発中に異なる銀行に異なるドッキングコードを作成する必要があります。これは、銀行と直接接続することの欠点でもあります!もちろん、銀行との直接的な関係も有益です。つまり、セキュリティは必要ありません。
さまざまな銀行のさまざまなコード(短所)を作成します。
安全性(利点);
処理料なし(利点);
小規模の電子商取引銀行は、接続(短所)を許可していません。
上の図に示すように、顧客がクリックして電子商取引のウェブサイトで支払いを確認した後、彼は第三者のウェブサイトに向けられ、第三者が銀行に接続します。これは、eコマースがパラメーターをサードパーティに渡す必要があることを示しています!第三者は、パラメーターを銀行に渡します。この方法の利点は、各銀行にパラメーターを提供することなく、第三者のためにのみ開発する必要があることです。各銀行にパラメーターを提供することは、サードパーティのタスクです。ただし、第三者が古くて信頼できない場合、第三者が破産し、人々が逃げた場合、あなたのお金はなくなります。顧客が支払ったお金は銀行口座に送られないため、第三者の銀行口座に支払われ、第三者に口座があります。さらに、第三者は、通常は1%ではないが、これは少数ではありません(本当に悪いです)。
3。サードパーティのオンライン支払いルールを通じて
eコマースが商人を第三者に登録したい場合、第三者にICP認定を提供する必要があります。 ICPビジネスライセンスは、全国の「インターネット管理措置」に従ってビジネスWebサイトで処理する必要があるWebサイトビジネスライセンスです。そうでない場合、運用することは違法です。
練習のためだけにICPを申請することはできません!そのため、商人をサードパーティに登録することはできません。ただし、Yibaoに登録されている既製の商人がすでにあるため、このステップは無視できます。
Yibaoに正常に登録すると、Yibaoは次のことを提供します。
Yibaoでアカウントを開く(つまり、マーチャントコード):10001126856
Yibaoアクセス仕様:CHMファイル対称暗号化アルゴリズムクラス:Payuneutil.java
キー:69CL522AV6Q613II4W6U8K6XUW8VM1N6BFGYV769220IUYE9U37N4Y7RI4PL
Yibaoアクセス仕様では、Yibaoの支払いゲートウェイを見つけることができます。これは、実際にはURLであり、Yibao:https://www.yeepay.com/app-merchant-proxy/nodeに接続するために使用されるURLです。
Yibaoアクセス仕様では、Yibaoが必要とするパラメーターも見つけることができます。 eコマースがYibaoに接続する場合、これらのパラメーターは支払いゲートウェイに渡す必要があります。
公式リクエストアドレス:https://www.yeepay.com/app-merchant-proxy/node
これらのパラメーターはURLに追加する必要があります。
ただし、これらのパラメーターの値を暗号化する必要があることに注意してください。暗号化キーと暗号化アルゴリズムYibaoの両方が提供します!
ここで、P8_URLは、支払いが成功したときに戻るページを示します。これは、結果を表示するページを書く必要があることを意味します。支払いが成功した後、第三者が指定した返品ページにリダイレクトされ、パラメーターもいくつか届きます。私たちのページは、これらのパラメーターを取得してページに表示する必要があります。以下は、第三者によって返されるパラメーターです。
4.サードパーティのオンライン支払いシステムを開発します
ステップ:
index.jspページ: Buyservletに提出されたフォーム。フォーム項目には、注文番号、支払い額、銀行の選択が含まれます
BuyServlet:フォームデータを取得し、サードパーティのゲートウェイに接続する準備をします。 index.jspページには3つのパラメーターのみが与えられており、第三者に必要な多くのパラメーターがあるため、ページで与えられないパラメーターはBuyservletで補完されます。また、パラメーターも暗号化する必要があります。これもBuyServletで完了する必要があります
BackServlet:ユーザーが正常に支払うと、第三者が指定した返品ページにリダイレクトします。バックセルブレットを返品ページとして使用します。これは、サードパーティによって渡されたパラメーターを受信し、ページに表示するために使用されます。
私たちはすでにYibaoに登録事業を行っているため、自分でビジネスを登録する必要はありません。したがって、ここでは、Yibaoをテスト用のサードパーティの支払いプラットフォームとして使用します。 eコマース(ICP認定に合格しなければならないeコマース)がないため、サードパーティにビジネスを登録することもできません。
現在使用しているYibaoビジネスは、YibaoのBaba Sports Networkが登録したビジネスであるChuanzhi Podcastによって提供されています。そのため、テスト中に支払われたお金は、YibaoのBaba Sports Networkが登録した会社に与えられました。
ステップ1: index.jsp
<form action = "" method = "post">注文番号:<入力タイプ= "テキスト" name = "p2_order"/> <br/> rument:<入力タイプ= "text =" text "name =" p3_amt "/> <br/>バンクを選択:<input =" radio "name" name "name" pd_frpid "value =" icb-b2c "/>産業およびコマーシャルバンクsrc = "bank_img/icbc.bmp" align = "middle"/> <入力タイプ= "radio" name "pd_frpid" value = "boc-net-b2c"/> bank of china <img src = "bank_img/icbc.bmp" align = "middle"/> value = "boc-net-b2c"/> bank of china <img src = "bank_img/bc.bmp" align = "middle"/> <br/> <入力タイプ= "radio" name "pd_frpid" value = "abc-net-b2c"/>中国の農業銀行<img = "" alcigng/<"" aligng name = "pd_frpid" value = "ccb-net-b2c"/> Construction Bank <img src = "bank_img/ccb.bmp" align = "middle"/> <br/> <入力タイプ= "ラジオ" name = "pd_frpid" value = "boco-net-b2c"/>>バンクコミュニケーション<img src = "bank_mg align = "middle"/> <br/> <入力タイプ= "" submit "value ="確認 "/> </form>
各銀行の対応する値:
ステップ2: buyservlet.java
パブリッククラスのBuyservletは、httpservlet {public void dopost(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {request.setcharacterencoding( "utf-8")を拡張します。 Response.setContentType( "text/html; charset = utf-8"); String P0_CMD = "Buy"; //ビジネスタイプ、固定値は購入です。つまり、「購入」文字列P1_MERID = "10001126856"; //ビジネス名String P2_order = request.getParameter( "p2_order"); //注文番号文字列p3_amt = request.getParameter(p3_amt ";トランザクション通貨、固定値はCNYで、rmb string p5_pid = ""; // product name string p6_pcat = ""; // product name string P7_pdesc = ""; //製品説明String P8_url = "http:// localhost:8080/backservlet"; //製品説明文字「http:// localhost:8080/buy/backservlet "; // e-commerceの返品ページ、支払いが成功した場合、yibaoはこのページにリダイレクトされますstring p9_saf =" "; //配信先住所String pa_mp =" "; //製品拡張情報String String Pd_frpid = request.getParameter"); pr_needResponse = "1"; //応答メカニズム、固定値は1 // yibaoによって提供され、商人とyibaoのみがこのキーを知っています。 string keyvalue = "69cl522226q613ii4w6u8k6xuw8vm1n6bfgyv769220iuye9u37n4y7ri4pl"; //上記のパラメーター、キー、暗号化アルゴリズムを介して、HMAC値が生成されます//パラメーターの順序が必要です。値がない場合、nullを指定することはできませんが、空の文字列を指定する必要があります。 String hmac = Payuntutil.Buildhmac(P0_CMD、P1_MERID、P2_ORDER、P3_AMT、P4_CUR、P5_PID、P6_PCAT、P7_PDESC、P8_URL、P9_SAF、PA_MP、PD_FRPID、PR_NEDRESPENSEPHENS、KEYVALUE); //すべてのパラメーターをゲートウェイアドレスに接続する文字列url = "https://www.yeepay.com/app-merchant-proxy/node"; url + = "?p0_cmd =" + p0_cmd + "&p1_merid =" + p1_merid + "&p2_order =" + p2_order + "&p3_amt =" + p3_amt + "&p4_cur =" + p4_cur + " "&p7_pdesc =" + p7_pdesc = " + p7_pdesc +"&p8_url = " + p8_url =" + p8_url + "&p9_saf =" + p9_saf + "&pa_mp =" + pa_mp + " pr_needResponse + "&hmac =" + hmac; System.out.println(url); // Gateway Response.sendredirect(url)にリダイレクトします。 }}ステップ3:バックサーブレット
パブリッククラスのバックセルブレットは、httpservlet {public void doget(httpservletrequest request、httpservletresponse応答)servletexception、ioexception {respons.setcontenttype( "text/html; charset = utf-8")を拡張します。 / * * yibaoは一連の結果パラメーターを提供します。必要なものを取得できます *支払い結果を取得します:R1_Code、1は、支払いが成功することを意味します。 *支払い額を取得する:R3_AMT * eコマース注文番号を取得:R6_order *結果のリターンタイプを取得します。 */ string r1_code = request.getParameter( "r1_code");文字列r3_amt = request.getParameter( "r3_amt");文字列r6_order = request.getParameter( "r6_order"); string r9_btype = request.getParameter( "r9_btype"); if(r1_code.equals( "1")){if(r9_btype.equals( "1")){response.getWriter()。print( "<h1> pay furstfully </h1>"); // "<br/>"); Response.getWriter()。print( "注文番号IS:" + r6_order + "<br/>"); }}}}Yibao支払いによって提供されるHMACを取得するためのツール
public class Payuneutil {private static string encodingcharset = "utf-8"; /*** HMACメソッドを生成** @Param P0_CMDビジネスタイプ* @Param P1_MERID MERCHNACT NUMBER* @Param P2_Order Merchant Order Number* @Param P3_AMT支払い数* @Param P4_CUR Transaction Currency支払いの成功データ* @Param P9_SAF配達アドレス* @Param PA_MPマーチャントエクステンション情報* @Param PD_FRPID BANK CODE* @PARAM PR_NEEDRESPONSE応答メカニズム* @RETURN*/パブリックサチック文字列ビルドHMAC(STRING P0_CMD、STRING P1_MERID、STRING P3_MAM P5_PID、STRING P6_PCAT、STRING P7_PDESC、STRING P8_URL、STRING P9_SAF、STRING PA_MP、STRING PD_FRPID、STRING PR_NEEDRESPONSE、STRING KEYVALUE){StringBuilder svalue = new StringBuilder(); //ビジネスタイプSVALUE.APPEND(P0_CMD); // merchant number svalue.append(p1_merid); //販売者注文番号svalue.append(p2_order); //支払い額svalue.append(p3_amt); //取引通貨svalue.append(p4_cur); //製品名svalue.append(p5_pid); //製品タイプsvalue.append(p6_pcat); //製品の説明svalue.append(p7_pdesc); //支払いの成功データを受け取る商人のアドレスsvalue.append(p8_url); //配信アドレスsvalue.append(p9_saf); // merchant拡張情報svalue.append(pa_mp); //銀行コードsvalue.append(pd_frpid); //応答メカニズムsvalue.append(pr_needResponse); return payminceutil.hmacsign(svalue.tostring()、keyvalue); } /***検証に戻るhmacメソッド** @param hmac暗号化された検証コード支払いゲートウェイ* @param p1_merid商人番号* @param R0_cmdビジネスタイプ* @param R1_code支払い結果R5_PID製品名* @Param R6_ORDERマーチャント注文番号* @Param R7_UID Yibao支払いメンバーID* @Param R8_MP Merchant Extension情報* @Param R9_BTYPEトランザクションリターンタイプ* @Param KeyValue Key* @return*/ public Static boolean verifecallback(String HMAC、String P1_merid、String P1_merid、String p1_merid、String p1_merid、 R2_TRXID、STRING R3_AMT、STRING R4_CUR、STRING R5_PID、STRING R6_ORDER、STRING R7_UID、STRING R8_MP、STRING R9_BTYPE、STRING KEYVALUE){StringBuilder SValue = new StringBuilder(); // merchant number svalue.append(p1_merid); //ビジネスタイプsvalue.append(r0_cmd); //支払い結果svalue.append(r1_code); // yibao支払いトランザクション番号svalue.append(r2_trxid); //支払い額svalue.append(r3_amt); //トランザクション通貨svalue.append(r4_cur); //製品名svalue.append(r5_pid); // merchant Order番号svalue.append(r6_order); // yibao支払いメンバーID svalue.append(r7_uid); // Merchant Extension Information Svalue.Append(R8_MP); //トランザクション結果returnタイプsvalue.append(r9_btype); string snewstring = payuneutil.hmacsign(svalue.tostring()、keyvalue); return snewstring.equals(hmac); } / ** * @param avalue * @param akey * @return * / 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(); } / ** * * @param args * @param key * @return * / 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){// System.out.println(hmacsign( "annulcard1000043252120080620160450.0http://localhost/szxpro/callback.asp海?4) 564868265473632445648682654736324511 "、" 8 upp0ke8sq73zvp370vko7c39403rtk1ywx40td6irh216036h27eb12792t "); //////////////////////////// }}Yibaoコールバック
ピアツーピア: Yibaoはeコマースに直接アクセスします。ここにはクライアントはいません。
この方法は必須であり、このように受け取ることはできません!固定IPがないためです
YibaoにはResendメカニズムがあります。それがあなたを訪問し、あなたがそれをメッセージに送り返さないなら、それは復活を続けます!
eコマースは、成功から始まる文字列を返す必要があります!
クライアントブラウザをガイドして、eコマースにリダイレクトします。クライアントにeコマースにアクセスさせることです!
使用できません!
HMAC: 13パラメーター値 + KeyValue(key) +アルゴリズム(MD5)
13パラメーター値:自分で設定!
KeyValue:Yibaoが登録した後に私たちに送ったもの、私たちとYibaoだけがこのことを知っていました!
基礎となるMD5のアルゴリズム:Paymentutil.buildhmac(14)、HMACを返す
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。