【代码库】在线支付

方式有两种:1、直接正对要支付的银行 2、对应第三方支付平台 

需要信息:第三方平台的开发文档:支付请求参数说明,以及返回的链接和参数--支付结果参数说明

重要的是安全:加密方式 :这里用的是MD5加密: MessageDigest md  = MessageDigest.getInstance("MD5"); 
 
在线付款流程:
在线付款加密过程:
方便理解一下代码,参考部分链接:

String、StringBuffer和StringBuilder的区别

 

JAVA中的getBytes()方法

// 加密工具类
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);
      // 把以上信息append成一个可变长度的字符串后.toString()成固定程度的String,KeyValue是密钥---进行代用加密方法hmacSign
      return PaymentUtil.hmacSign(sValue.toString(), keyValue);
   }
   
   /**
    * 加密的具体方法
    * @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);
   }

    // 把加密后的字节数组转化成String类型
   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();
   }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邢美玲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值