前のセクションでは、支払いページを表示しました。前のセクションに表示されているJSPコードから、ユーザーがクリックして支払いを確認すると、 $ {shop}/pay_gobank.actionのアクションにジャンプすることがわかります。つまり、送信した後、PayactionのGobankメソッド(つまりセクション21デモのフローチャートのロジック)のゴーバンクメソッドのロジックを処理する必要があります。つまり、プレーンテキストを取得し、署名(暗号文)に暗号化し、Yibao Serverにアクセスする必要があります。
ただし、MVCの設計パターンを考慮すると、上記のビジネスロジックを処理のためにサービスレイヤーに入れますので、セクション21にデモの支払いロジックを実装しましょう。
1。パラメーターをカプセル化するモデルを書きます
まず、JSPページから送信されたパラメーターを受信するためにモデル(SendData)を作成し、自分で送信する必要がある他のパラメーターを追加する必要があります。これらのパラメーターは、Yibaoの公式文書に規定されています。ドキュメントの規制に厳密に従うことができます。
/ * *モールからYibaoの支払いに送信された情報は、エンティティとしてカプセル化されています * */public class senddataはシリアル化可能{private static final long serialversionuid = -6304103739907145812L; //(*)必要なフィールドプライベート文字列p0_cmdを示します。 //ビジネスタイプ(*)、修正:プライベート文字列P1_MERID; //商人番号(*)プライベート文字列P2_ORDER; //商人注文番号プライベート文字列P3_AMT; //プライベート文字列P4_CUR; //トレーディング通貨(*)プライベート文字列P5_PID; //製品名プライベートストリングP6PCAT; P8_url; //支払い成功データを受け取る商人のアドレスプライベート文字列p9_saf; //配信アドレスプライベート文字列pa_mp;上記の属性はすべて、Yibaoに送信されるパラメーターです。必要なパラメーターを選択できます。それらのすべてが送信されるわけではありません。状況に応じて、P5、P6、およびP7を除いて、通常、それらを渡します。行動規範を見てみましょう。
2。支払いの実装
Payactionでは、主にJSPページに渡されたいくつかのパラメーターをモデルにカプセル化し、次のように他のパラメーターを初期化するためにサービスレイヤーメソッドを呼び出します。
@Controller( "Payaction")@scope( "Prototype")public class payaction extends baseeaction <object> explments parameteraware {public string gobank(){// 1。完全なパラメーター:P2 P3 PD PA、Forder forder =(forder)session.get( "oldforder")を取得する必要があります。ユーザーユーザー=(user)session.get( "user"); model.setp2_order(forder.getid()。toString()); // merchant Order Number Model.setp3_amt(forder.getTotal()。toString()); //支払い額モデル.setpa_mp(user.getemail() + "、" + user.getPhone()); //マーチャントエクステンション情報// 2。パラメーターを追加// 3。暗号化して署名を取得// 4。 Request DomainにPayservice.savedatatoRequest(リクエスト、モデル)に保存します。 // 2,3,4ビジネスロジックは、処理のためにサービスレイヤーに引き渡されます// 5。支払いページにジャンプしてくださいReturn "Pay"; }}次に、サービスレイヤーのコードを書きましょう。サービスレイヤーは、主に上記の2、3、および4ステップのロジックを実装しています。
3。サービスレイヤーの実装
特定のコードは次のとおりです。
// payservice interface public interface payservice {//リクエストマップに暗号化された情報を保存パブリックマップ<string、object> savedatatorequest(map <string、object> request、senddata senddata); //返されたデータを暗号化して暗号文を取得し、それを送信されたback ciphertext(後で実装)と比較します(後で実装します)パブリックブールチェックバックダタ(バックダタバックダタ);文字列キー; @value( "#{prop.p1_merid}")// merアカウント(注文番号ではない)プライベート文字列p1_merid; //成功した支払いのための返品アドレス@value( "#{prop.p8_url}")private string p8_url; //上記の3つの属性はすべて固定値です。Pay.PropertiesConfigurationファイルにそれらを入れ、Spring Annotation @Valueを直接使用してSendDataのデータを完了します。P2P3PD PAはフロントエンドインジェクションです。私はすでにprivate senddata finishsenddata(senddata senddata){senddata.setp0_cmd( "buy"); senddata.setp1_merid(p1_merid); senddata.setp4_cur( "cny"); senddata.setp5_pid( ""); senddata.setp6_pcat( ""); senddata.setp7_pdesc( ""); senddata.setp8_url(p8_url); senddata.setp9_saf( "0"); senddata.setpr_needResponse( "0"); senddataを返します。 } //データの追加を完了して、Applined Plantext Private String JOINSENDDATAPARAM(SENDDATA SENDDATA){//すべてのデータが入力されたSendData = this.finishsenddata(senddata); stringbuffer infobuffer = new StringBuffer(); infobuffer.append(senddata.getp0_cmd()); infobuffer.append(senddata.getp1_merid()); infobuffer.append(senddata.getp2_order()); infobuffer.append(senddata.getp3_amt()); infobuffer.append(senddata.getp4_cur()); infobuffer.append(senddata.getp5_pid()); infobuffer.append(senddata.getp6_pcat()); infobuffer.append(senddata.getp7_pdesc()); infobuffer.append(senddata.getp8_url()); infobuffer.append(senddata.getp9_saf()); infobuffer.append(senddata.getpa_mp()); infobuffer.append(senddata.getpd_frpid()); infobuffer.append(senddata.getpr_needresponse()); infobuffer.toString()を返します。 } //暗号化された情報をRequestMap @Override Public Map <String、object> SavedatatoreQuest(Map <String、Object> request、senddata senddata)に保存します{//文字列を返す(すなわち、Pleantext)String JoinParam = JoinendDataparam(senddata); request.put( "p0_cmd"、senddata.getp0_cmd()); request.put( "p1_merid"、senddata.getp1_merid()); request.put( "p2_order"、senddata.getp2_order()); request.put( "p3_amt"、senddata.getp3_amt()); request.put( "p4_cur"、senddata.getp4_cur()); request.put( "p5_pid"、senddata.getp5_pid()); request.put( "p6_pcat"、senddata.getp6_pcat()); request.put( "p7_pdesc"、senddata.getp7_pdesc()); request.put( "p8_url"、senddata.getp8_url()); request.put( "p9_saf"、senddata.getp9_saf()); request.put( "pa_mp"、senddata.getpa_mp()); request.put( "pd_frpid"、senddata.getpd_frpid()); request.put( "pr_needResponse"、senddata.getPr_needResponse()); request.put( "hmac"、digestutil.hmacsign(joinparam、key)); // signature(ciphertext)return request; }}実装の原則は、実際には以前のデモのサーブレットと同じであることがわかります。上記のコードでは、pay.propertiesファイルとアノテーションを使用します。 pay.propertiesファイルとbeans.xmlの構成を見てみましょう。
#Pay.PropertiesKey = W0P75WMZ203FR46R5I70V556WHFA94J14YW5J6VUH4YO3NRL5JSQF3C41677P1_MERID = 10000940764P8_URL = HTTPS/://www.hao123.com
<! - beans.xml - > <bean id = "prop"> <property name = "locations"> <array> <balue> classpath:public.properties </value> <! - 之前用到的 - > <balue> class.properties </value> </array> </property> </bean>
さて、アクションレイヤーとサービスレイヤーが書かれているので、struts.xmlファイルをもう一度構成しましょう。
4。Struts.xml構成とPay.jspページ
<アクションname = "pay_*" method = "{1}"> <result name = "pay">/user/pay.jsp </result> </action>struts.xmlの構成は非常に簡単です。主にuser/pay.jspページに戻り値に応じてジャンプし、上記のプレーンテキスト(パラメーター)とciphertext(署名)をyibaoサーバーに送信します。
<div> <span>注文番号:</span> <strong> $ {requestscope.p2_order} </strong> <span> [この番号を覚えておいてください。 src = "$ {shop} /files/yibao.jpg"/> </div> <div> <span>支払い銀行:</span> <img src = "$ {shop}/files/bankimages/$ {pd_frpid} .gif"/> </div> <form name = "Yeepay" "Yeepay" action = 'https://www.yeepay.com/app-merchant-proxy/node' method = 'post' target = "_ blank"> <input Type = 'hidden' name = 'p0_cmd' value = '$ {requestscope.p0_cmd}'> <input = 'epput =' $ '$' $ '$ type = 'hidden' name = 'p2_order' value = '$ {requestscope.p2_order}'> <入力タイプ= '非表示' name = 'p2_order' value = '$ {requestscope.p2_order}'> <入力タイプ= '非表示' name = 'p3_amt' value = '$ {requestscope =' name = 'p4_cur'> <inute value = '$ {requestscope.p4_cur}'> <入力タイプ= 'hidden' name = 'p5_pid' value = '$ {requestscope.p5_pid}'> <入力タイプ= 'hidden' name = 'p6_pcat' value = '$ {requestscope.p6_pcat}' value = '$ {requestscope.p7_pdesc}'> <入力タイプ= 'hidden' name = 'p8_url' value = '$ {requestscope.p8_url}'> <入力タイプ= 'hidden' name = 'p9_saf' value = '$ {requestscope.p9_saf}' value = '$ {requestscope.pa_mp}'> <入力タイプ= 'hidden' name = 'pd_frpid' value = '$ {requestscope.pd_frpid}'> <入力タイプ= "hidden" name = "pr_needresponse" value = "$ {requestscope.pr_needResponse} value = '$ {requestscope.hmac}'> <div> <入力タイプ= "submit" value = "pay now"/> </div> </form> </div> </div> Pay.jspは、渡したいすべてのプレーンテキストと、対応する暗号テキストをYibaoサーバーに送信します。 Yibaoは、これらのプレーンテキストに基づいて同じ方法で暗号テキストに暗号化し、送信した暗号テキストと一致させます。同じことがデータが安全であることを意味する場合、送信プロセス中に改ざんされず、正常に支払いページにジャンプしてから、通常の支払いを行います。同じでない場合、支払いは許可されておらず、フレンドリーなプロンプトページが表示されます。
この時点で、私はこのオンライン支払いプロセスについてすでに明確にしています。その理由は非常に簡単です。パラメーターを組み合わせてそれらを形成し、パスワードを追加して暗号文を生成し、これらのパラメーターと暗号文をサードパーティに送信することにすぎません。彼はまた、同じ暗号化方法にパスワードを追加し、それを私が送ったものと比較します。銀行のインターフェースを呼び出す方法に関しては、それは私たちがしなければならないことではありません。これは、いくつかのセキュリティを含む第三者の責任です。誰もが自分の問題に集中することができます。私は、第三者とつながり、有用な情報を彼に伝える必要があります。サードパーティは、さまざまな銀行との接続方法に焦点を合わせるだけで、開発に大きな利便性をもたらします。さまざまな銀行に接続されているインターフェイスは間違いなく異なるためです。銀行と直接接続する場合、コストが高すぎて維持するのは不便です。銀行がアップグレードされた場合、私もそれらをアップグレードする必要があります...サードパーティでは、それについて心配する必要はありません。アップグレードは第三者の問題であり、サードパーティとのインターフェースは変更されません〜
オリジナルリンク:http://blog.csdn.net/eson_15/article/details/51464415
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。