程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> SSH框架網上商城項目第21戰之詳解易寶付出的流程

SSH框架網上商城項目第21戰之詳解易寶付出的流程

編輯:關於JAVA

SSH框架網上商城項目第21戰之詳解易寶付出的流程。本站提示廣大學習愛好者:(SSH框架網上商城項目第21戰之詳解易寶付出的流程)文章只能為提供參考,不一定能成為您想要的結果。以下是SSH框架網上商城項目第21戰之詳解易寶付出的流程正文


這一節我們先寫一個簡略點的Demo來測試易寶付出的流程,熟習這個流程後,再做現實的開辟,由於是一個Demo,所以我沒有斟酌一些設計形式的器械,就是直接完成付出功效。完成付出功效須要易寶給我們供給的API。那末成績來了,應用第三方付出平台最重要的一件事就是獲得該平台的API,我們起首得獲得他們的API和開辟文檔,然後才可以做進一步的開辟。

1. 獲得易寶的API

獲得API的第一步,要在易寶上注冊一個賬號,這個賬號是商家的賬號,前面買家付款後,會將錢款存入該賬號中,然後商家本身提取到銀行卡,易寶在提取進程中收取必定的手續費。這就是易寶的盈利形式。然則注冊勝利須要條件,那就是本身得有一個網站,或許是一個公司,吧啦吧啦等器械,橫豎就是你得有資歷請求,這點易寶會審核的,知足了才會許可你注冊,才會給你供給他們的接口,不是一切人都可以注冊的。我用的也是他人注冊好的,我本身啥也沒有……也沒法注冊……屌絲一個,年夜家懂的~然則普通在公司裡開辟的話,就不會存在這個成績,賬號確定都是有的,最主要的是要控制開辟流程和相干技巧~

2. 測試付出流程

有了官方供給的API和技巧文檔後,便可以著手開辟了,在這裡重要寫一個簡略的demo來測試一下易寶付出的流程,demo的構造很簡略,一個servlet,一個filter,兩個jsp頁面和一個加密的對象類。servlet與易寶辦事器端打交道,我們做一些跟易寶接口相干的處置,filter是用來處置能夠湧現的中文亂碼成績,兩個jsp中一個是前台頁面。
我們先來剖析一下付出要求的進程,以下所示:

好了,上面我們詳細剖析一下demo中的相干代碼:

2.1 前台測試頁面

起首看一下前台頁面index.jsp的詳細代碼

<%@ page language="java" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>

  <title>前台首頁</title>
 </head>

 <body>
  <h1>在線付出演示</h1>
  <form action="${pageContext.request.contextPath }/servlet/PayServlet" method="post">
     此次購物定單編號<input type="text" name="p2_Order" /><br>
     money<input type="text" name="p3_Amt" value="0.01"/><br>
     工商銀行<input type="radio" value="ICBC-NET" name="pd_FrpId">
     扶植銀行<input type="radio" value="CCB-NET" name="pd_FrpId"><br>
     <input type="submit" value="submit" />
     <input type="hidden" value="pay" name="status"/>
  </form>
 </body>
</html>

從下面的jsp頁面中可以看出,這些input標簽中的name屬性值都很奇異,pi_功效(i=0,1,2,…,9),固然i還有其他的值,這得參照易寶的官方文檔,這些name表現絕對應的屬性,到時刻會傳到sevlet處置,關於這些屬性值,我截了個圖,以下:


  

這些參數名有些在現實項目中是前台傳出去的,好比下面寫的定單號,要付若干錢,這些在定單確認的時刻都邑帶曩昔,那末其他參數,必填的話,須要在servlet裡指定好,非必填字段的話,便可認為空,這裡的空不是null,而是”“,前面servlet中會提到。
再看看兩個銀行中對應的value值也是固定的,易寶會供給它所支撐的一切銀行的value值,這些都是固定的,不克不及修正的。這裡就寫兩個銀行測試一下後果。
最初誰人隱蔽字段是用來在servlet中做斷定的,是付出照樣付出勝利後的前往,上面在sevlet中會解釋。

2.2 Servlet處置要求

servlet重要處置與易寶的相干要求,外面有兩個部門的內容,一部門是向易寶發送明文和密文,另外一部門是斷定易寶發過去的明文和密文,我們看看demo中詳細的完成代碼:

public class PayServlet extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String status = request.getParameter("status");
    if (status.equals("pay")) { //index.jsp中隱蔽字段傳來的是pay,所以處置付出這部門
      // 加密的密鑰,用在加密算法中,由付出中介供給,每一個商家舉世無雙的
      String keyValue = "w0P75wMZ203fr46r5i70V556WHFa94j14yW5J6vuh4yo3nRl5jsqF3c41677";
      // 1: 給參數賦值,這些參數(即明文)都是易寶官方供給的文檔中所界說的,名字我們不克不及改
      String p0_Cmd = formatString("Buy");
      String p1_MerId = formatString("10000940764");
      String p2_Order = formatString(request.getParameter("p2_Order"));
      String p3_Amt = formatString(request.getParameter("p3_Amt"));
      String p4_Cur = formatString("CNY");
      String p5_Pid = "";
      String p6_Pcat = "";
      String p7_Pdesc = "";
      String p8_Url = "http://www.tongji.edu.cn";//這是付出勝利後跳轉到的頁面,可以設為商城首頁,這個demo就用同濟年夜學主頁好了……
      String p9_SAF = "0";
      String pa_MP = "";
      String pd_FrpId = formatString(request.getParameter("pd_FrpId"));
      pd_FrpId = pd_FrpId.toUpperCase();
      String pr_NeedResponse = "0";

      String hmac = formatString("");//hmac是用來存儲密文的
      /*下面一切的明文都用都用formatString辦法包裝了一下,該辦法鄙人面,重要是將null轉換成""
       *由於null是沒法轉換成密文的*/

      // 處理數據平安性成績: 把明文加密--->密文  然後把明文和密文都交給易寶 
      // 易寶拿到數據後,把傳過去的明文加密, 和傳過去密文比擬,
      // 假如相等數據沒有被改動 (商家與易寶加密時都用的是雷同key)

      // 把明文數據追加到StringBuffer,留意追加次序不克不及改,不然生成的密文會分歧的,
      // 要嚴厲依照易寶的官方文檔說名來寫才行,由於易寶那裡就是依據文檔中的次序追加的
      StringBuffer 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中,加密算法易寶會供給的,由於他那裡也得用雷同的算法
      hmac = DigestUtil.hmacSign(infoBuffer.toString(), keyValue);
      // 把明文和密文都存儲到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中,將這些信息提交到易寶
      request.getRequestDispatcher("/reqpay.jsp").forward(request,
          response);
    } else if (status.equals("success")) {//易寶那裡傳來的是success,處置前往驗證部門
      PrintWriter out = response.getWriter();
      String keyValue = "w0P75wMZ203fr46r5i70V556WHFa94j14yW5J6vuh4yo3nRl5jsqF3c41677";
      // 獲得一切的明文
      String r0_Cmd = formatString(request.getParameter("r0_Cmd")); 
      String p1_MerId = request.getParameter("p1_MerId");
      String r1_Code = formatString(request.getParameter("r1_Code"));
      String r2_TrxId = formatString(request.getParameter("r2_TrxId"));
      String r3_Amt = formatString(request.getParameter("r3_Amt"));
      String r4_Cur = formatString(request.getParameter("r4_Cur"));
      String r5_Pid = new String(formatString(
          request.getParameter("r5_Pid")).getBytes("iso-8859-1"),
          "UTF-8");
      String r6_Order = formatString(request.getParameter("r6_Order"));
      String r7_Uid = formatString(request.getParameter("r7_Uid"));
      String r8_MP = new String(formatString(
          request.getParameter("r8_MP")).getBytes("iso-8859-1"),
          "UTF-8");
      String r9_BType = formatString(request.getParameter("r9_BType"));
      // 對明文停止數據追加
      String hmac = formatString(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);
      // 對前往的明文停止加密
      String md5 = DigestUtil.hmacSign(infoBuffer.toString(), keyValue);
      // 斷定加密的密文與傳過去的數據簽名能否相等
      boolean isOK = md5.equals(hmac);
      if (isOK && r1_Code.equals("1")) {//r1_Code為1表現勝利
        //把付出勝利的定單狀況改成已付出,並個給用戶顯示付出勝利信息
        //挪用郵件辦事接口,短信發送辦事等
        //這裡就打印一句話呗~
        out.println("定單編號為:" + r6_Order + "付出金額為:" + r3_Amt);

      } else {
        out.println("fail !!!!");
      }
    }
  }

  public void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    doGet(request, response);
  }

  String formatString(String text) {
    if (text == null) {
      return "";
    }
    return text;
  }
}

2.3 加密算法

明文轉密文所用到的加密算法由易寶供給,我們只須要用它將明文轉為密文便可,算法以下:

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];
    byte keyb[];
    byte value[];
    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);
    }

    MessageDigest md = null;
    try {
      md = MessageDigest.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();
    byte value[];
    try {
      value = aValue.getBytes(encodingCharset);
    } catch (UnsupportedEncodingException e) {
      value = aValue.getBytes();
    }
    MessageDigest md = null;
    try {
      md = MessageDigest.getInstance("SHA");
    } catch (NoSuchAlgorithmException e) {
      e.printStackTrace();
      return null;
    }
    return toHex(md.digest(value));

  }

  //我本身用來測試的
  public static void main(String[] args) {
    // 參數1: 明文(要加密的數據) 參數2: 密鑰
    System.out.println(DigestUtil.hmacSign("11111", "abc"));
    System.out.println(DigestUtil.hmacSign("11111", "abd"));
  // 處理數據平安性成績: 把明文加密--->密文  然後把明文和密文都交給易寶 
  // 易寶拿到數據後,把傳過去的明文加密, 和傳過去密文比擬,假如相等數據沒有被改動 (商家與易寶加密時都用的是雷同key)   
  }
}

加密算法也不去過量的研討了,似乎是md5二代加密算法,橫豎把明文扔出來,確定加密成密文就好了。上面再看一下reqpay.jsp頁面:

<%@page language="java" contentType="text/html;charset=gbk"%>
<html>
  <head>
    <title>To YeePay Page
    </title>
  </head>
  <body>
    <form name="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 type='hidden' name='p1_MerId' value='${requestScope.p1_MerId}'>
      <input type='hidden' name='p2_Order' value='${requestScope.p2_Order}'>
      <input type='hidden' name='p3_Amt'  value='${requestScope.p3_Amt}'>
      <input type='hidden' name='p4_Cur'  value='${requestScope.p4_Cur}'>
      <input type='hidden' name='p5_Pid'  value='${requestScope.p5_Pid}'>
      <input type='hidden' name='p6_Pcat' value='${requestScope.p6_Pcat}'>
      <input type='hidden' name='p7_Pdesc' value='${requestScope.p7_Pdesc}'>
      <input type='hidden' name='p8_Url'  value='${requestScope.p8_Url}'>
      <input type='hidden' name='p9_SAF'  value='${requestScope.p9_SAF}'>
      <input type='hidden' name='pa_MP'  value='${requestScope.pa_MP}'>
      <input type='hidden' name='pd_FrpId' value='${requestScope.pd_FrpId}'>
      <input type="hidden" name="pr_NeedResponse" value="${requestScope.pr_NeedResponse}">
      <input type='hidden' name='hmac' value='${requestScope.hmac}'>
      <input type='submit' />
    </form>
  </body>
</html>

其實該頁面很簡略,就是將明文和密文一路經由過程<form>表單傳到易寶,易寶的吸收url為https://www.yeepay.com/app-merchant-proxy/node,這也是易寶官方供給的,我們寫成這個便可以了。其實就一個submit按鈕,點擊submit按鈕就可以將明文和密文提交曩昔了。我們看一下測試成果:

3. 測試付出成果

  粗陋的測試前台index.jsp~~~:

     

提交後會到reqpay,jsp,點擊提交按鈕後的後果以下,我們將工行和建行都測一下:

 


  

付出流程都沒啥成績,原來預備去工行交個1分錢看一下付出完成後的成果,成果發明U盾過時了,由於如今用付出寶比擬便利嘛……就沒去更新U盾了,然則我守舊過工行的e付出,所以下面誰人界面中也能夠應用e付出,因而我就很年夜方的付了1分錢~~成果以下:


  

然後會跳轉到我們之前指定的頁面,也就是同濟年夜學咯……好了,測試完成了,全部付出流程停止!
這一節重要是經由過程一個簡略的demo測試一下,看可否和銀行的付出界面接上,如今測試是沒成績的,曾經接上了,前面只需照舊付出便可。簡略的demo就引見到這吧,前面就真正持續我們之前的網上商城項目標在線付出模塊的開辟了。

原文地址:http://blog.csdn.net/eson_15/article/details/51447492

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved