转载

【Java EE 学习第21天 使用易宝支付接口实现java网上支付功能】

一、网上支付分为两种情况,一种方法是使用直接和银行的支付接口,另外一种方法是使用第三方支付平台和银行对接完成支付。

1.直接和银行对接。

【Java EE 学习第21天 使用易宝支付接口实现java网上支付功能】

2.使用第三方支付平台

【Java EE 学习第21天 使用易宝支付接口实现java网上支付功能】

3.常见的第三方支付平台

【Java EE 学习第21天 使用易宝支付接口实现java网上支付功能】

二、使用易宝支付接口实现java网上支付功能(农业银行)。

1.完整源代码:https://github.com/kdyzm/day21_2_pay

2.实现过程的时序图

【Java EE 学习第21天 使用易宝支付接口实现java网上支付功能】

3.技术要点

(1)使用GET请求的时候必须将全部参数都带上,参数名称参考开发者文档中的请求参数列表

(2)使用PaymentUtil类实现加密,该类由易宝支付公司编写

(3)支付成功之后通知商户按钮指向的url在本地,即http://localhost:8080/backServlet(localhost只在本地有意义),为什么能够成功返回这里,原理见上面流程图。关键点:重定向技术解决了这一问题。

4.需要的几点信息。

(1)商户账号:p1_MerId=10001126856

(2)商户的keyVaue:keyValue=69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl

(3)PaymentUtil类。

【Java EE 学习第21天 使用易宝支付接口实现java网上支付功能】
package com.kdyzm.utils;  import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays;  public class PaymentUtil {      private static String encodingCharset = "UTF-8";          /**      * 生成hmac方法      *       * @param p0_Cmd 业务类型      * @param p1_MerId 商户编号      * @param p2_Order 商户订单号      * @param p3_Amt 支付金额      * @param p4_Cur 交易币种      * @param p5_Pid 商品名称      * @param p6_Pcat 商品种类      * @param p7_Pdesc 商品描述      * @param p8_Url 商户接收支付成功数据的地址      * @param p9_SAF 送货地址      * @param pa_MP 商户扩展信息      * @param pd_FrpId 银行编码      * @param pr_NeedResponse 应答机制      * @param keyValue 商户密钥      * @return      */     public static String buildHmac(String p0_Cmd,String p1_MerId,             String p2_Order, String p3_Amt, String p4_Cur,String 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);         // 商户编号         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);         // 商户扩展信息         sValue.append(pa_MP);         // 银行编码         sValue.append(pd_FrpId);         // 应答机制         sValue.append(pr_NeedResponse);                  return PaymentUtil.hmacSign(sValue.toString(), keyValue);     }          /**      * 返回校验hmac方法      *       * @param hmac 支付网关发来的加密验证码      * @param p1_MerId 商户编号      * @param r0_Cmd 业务类型      * @param r1_Code 支付结果      * @param r2_TrxId 易宝支付交易流水号      * @param r3_Amt 支付金额      * @param r4_Cur 交易币种      * @param r5_Pid 商品名称      * @param r6_Order 商户订单号      * @param r7_Uid 易宝支付会员ID      * @param r8_MP 商户扩展信息      * @param r9_BType 交易结果返回类型      * @param keyValue 密钥      * @return      */     public static boolean verifyCallback(String hmac, String p1_MerId,             String r0_Cmd, String r1_Code, String 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();         // 商户编号         sValue.append(p1_MerId);         // 业务类型         sValue.append(r0_Cmd);         // 支付结果         sValue.append(r1_Code);         // 易宝支付交易流水号         sValue.append(r2_TrxId);         // 支付金额         sValue.append(r3_Amt);         // 交易币种         sValue.append(r4_Cur);         // 商品名称         sValue.append(r5_Pid);         // 商户订单号         sValue.append(r6_Order);         // 易宝支付会员ID         sValue.append(r7_Uid);         // 商户扩展信息         sValue.append(r8_MP);         // 交易结果返回类型         sValue.append(r9_BType);         String sNewString = PaymentUtil.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];         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();     }      /**      *       * @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();         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) { //        System.out.println(hmacSign("AnnulCard1000043252120080620160450.0http://localhost/SZXpro/callback.asp杩?4564868265473632445648682654736324511","8UPp0KE8sq73zVP370vko7C39403rtK1YwX40Td6irH216036H27Eb12792t")); //    } }
PaymentUtil.java

(4)注意:该商户账号是传智播客某老师的账号,在 进行 测试的时候会实际打钱过去,所以在 选择支付数额的时候千万要谨慎!!!

5.支付过程:

(1)填写订单信息

【Java EE 学习第21天 使用易宝支付接口实现java网上支付功能】

(2)单击支付按钮之后重定向到农业银行支付界面( 如果网速慢点能够看到易宝支付处理的过程

【Java EE 学习第21天 使用易宝支付接口实现java网上支付功能】

(3)我进行的是K码支付

【Java EE 学习第21天 使用易宝支付接口实现java网上支付功能】

(4)填写相应的信息,进行身份验证之后(短信),单击确定按钮(谷歌浏览器不支持后续操作,我换了IE浏览器)

【Java EE 学习第21天 使用易宝支付接口实现java网上支付功能】

(5)支付成功,自动跳转到支付成功页面

【Java EE 学习第21天 使用易宝支付接口实现java网上支付功能】

(6)单击通知商户按钮,跳转到的页面是同一个。

【Java EE 学习第21天 使用易宝支付接口实现java网上支付功能】

三、总结

1、java实现网上支付功能并不难,几乎没有任何技术要点,关键就是太繁琐,要学会读开发者文档。

2.重定向技术在这里非常重要,要根据时序图理解重定向在这里的使用。

正文到此结束
Loading...