博客
关于我
【Java EE 学习 21 下】【 使用易宝支付接口实现java网上支付功能】
阅读量:427 次
发布时间:2019-03-06

本文共 6846 字,大约阅读时间需要 22 分钟。

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

  1.直接和银行对接。

  

  2.使用第三方支付平台

  

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

  

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

  1.完整源代码:

  2.实现过程的时序图

   

  3.技术要点

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

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

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

  4.需要的几点信息。

    (1)商户账号:p1_MerId=10001126856

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

    (3)PaymentUtil类。

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)填写订单信息

      

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

    

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

  

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

    

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

      

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

      

 

三、总结

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

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

 

转载地址:http://ykcyz.baihongyu.com/

你可能感兴趣的文章
Linux 安装Redis 5.0(以及参数调优)
查看>>
html5 Game开发系列文章之 零[开篇]
查看>>
为什么阿里巴巴要求谨慎使用ArrayList中的subList方法
查看>>
Redis不是一直号称单线程效率也很高吗,为什么又采用多线程了?
查看>>
Requests实践详解
查看>>
接口测试简介
查看>>
Golang Web入门(4):如何设计API
查看>>
让sublime实现js控制台(前提是安装了nodejs)
查看>>
error: 'LOG_TAG' macro redefined
查看>>
ES6基础之——new Set
查看>>
nodeJS实现识别验证码(tesseract-ocr+GraphicsMagick)
查看>>
玩玩小爬虫——试搭小架构
查看>>
Javascript之旅——第八站:说说instanceof踩了一个坑
查看>>
Javascript之旅——第九站:吐槽function
查看>>
Sql Server之旅——第十站 看看DML操作对索引的影响
查看>>
双十一来了,别让你的mongodb宕机了
查看>>
Tomcat 热部署
查看>>
深入解析 HTTP 缓存控制
查看>>
深入浅出访问者模式
查看>>
深入探索Android热修复技术原理读书笔记 —— 热修复技术介绍
查看>>