cybersource支付对接

开始对接之旅

在对接过程中走了很多弯路,官方给出的看着一知半解,主要是都是英文翻译的文档,本次我来分享下Secure Acceptance自动集成的支付方式。
这里准备了一份html的官方文档和pdf的版本
pdf文档
html文档
请按照文档进行商户账号注册和支付方式设置这里不多说了上图看看

商户配置

在这里插入图片描述
Profile ID 和 秘钥是支付的关键

下单代码

//传参请根据自己的业务逻辑进行修改
    private Map<String,String> initPayGlocashInfoRefVo(PayMerchantAccountVo shroffAccountInfo, IntfPayRefVo intfPayRefVo,JsonNode jsonNode) throws Exception {
        Map<String,String> data = new HashMap<>(20);
        data.put("access_key", shroffAccountInfo.getPassword());//上面提到的秘钥
        data.put("profile_id", shroffAccountInfo.getPayMerchantId());//Profile ID 支付认证
        data.put("transaction_uuid", String.valueOf(UUID.randomUUID()));
        data.put("signed_date_time",  CybersourceUtil.getUTCDateTime());
        data.put("locale", jsonNode.get("locale").textValue());
        data.put("transaction_type", jsonNode.get("transaction_type").textValue());
        data.put("reference_number", intfPayRefVo.getPayTransactionsId());
        BigDecimal amount = BigDecimal.valueOf(Double.parseDouble(intfPayRefVo.getOrderAmt())/100);
        data.put("amount", String.valueOf(amount));
        data.put("currency", jsonNode.get("currency").textValue());
        data.put("bill_to_email", intfPayRefVo.getMemberEmail());
        //开关账单信息自动填写 这个是必填信息这里我不想填后台默认填写了地址
        boolean isBill = jsonNode.get("isBill").asBoolean();
        if (isBill){
            data.put("bill_to_address_line1","1 My Apartment");
            data.put("bill_to_address_city","Mountain View");
            data.put("bill_to_address_state", "CA");
            data.put("bill_to_address_country", "US");
            data.put("bill_to_address_postal_code","94043");
        }
        data.put("unsigned_field_names", "");
        data.put("signed_field_names", CybersourceUtil.buildDataToString(data));
        String sign = null;
        sign = CybersourceUtil.sign(data,shroffAccountInfo.getSign());
        data.put("signature", sign);
        log.info("cybersource transaction create data:{}",JsonUtils.writeValueAsString(data));
        return data;
    }

由后台处理的下单信息进行加密传递给前段由前段进行表单提交

<form id="payment_confirmation" action="https://testsecureacceptance.cybersource.com/oneclick/pay" method="post"/>	

这个是测试支付提交 生产替换一下
https://secureacceptance.cybersource.com/oneclick/pay

CybersourceUtil 加密工具类(这个是dome 里面js 提取出来的)

public class CybersourceUtil {
	//这个是支付秘钥的私钥 和加密方式
    private static final String HMAC_SHA256 = "HmacSHA256";
    private static final String SECRET_KEY = "9588e91d3823423d85b9b07d790990b5e95c89fac9be4592ae45bffbc2de31bd44fd649b3e874fe7abe39c8b7465323de40d2f6521b641968cf20cad39d3232263fad416ffe945e2a36466c9b6347664c0eb9e9a055748cc9d2bb0630768a53f350dc38ea322421e8d9aedefb8374df8d849dea9cdff4ae08d3e57fc07ddfdb5";

    public static String sign(Map<String,String> params,String SECRET_KEY) throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException {
        return sign(buildDataToSign(params), SECRET_KEY);
    }

    public static String sign(String data, String secretKey) throws InvalidKeyException, NoSuchAlgorithmException, UnsupportedEncodingException {
        SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(), HMAC_SHA256);
        Mac mac = Mac.getInstance(HMAC_SHA256);
        mac.init(secretKeySpec);
        byte[] rawHmac = mac.doFinal(data.getBytes("UTF-8"));
        return DatatypeConverter.printBase64Binary(rawHmac).replace("\n", "");
    }

    private static String buildDataToSign(Map<String,String> params) {
        String[] signedFieldNames = String.valueOf(params.get("signed_field_names")).split(",");
        ArrayList<String> dataToSign = new ArrayList<String>();
        for (String signedFieldName : signedFieldNames) {
            dataToSign.add(signedFieldName + "=" + String.valueOf(params.get(signedFieldName)));
        }
        return commaSeparate(dataToSign);
    }

    public static String buildDataToString(Map<String,String> params) {
        StringBuilder stringBuilder = new StringBuilder();
        for (Map.Entry<String, String> key : params.entrySet()) {
            stringBuilder.append(key.getKey()+",");
        }
        stringBuilder.append("signed_field_names");
        String str = stringBuilder.toString();
        return str;
    }

    private static String commaSeparate(ArrayList<String> dataToSign) {
        StringBuilder csv = new StringBuilder();
        for (Iterator<String> it = dataToSign.iterator(); it.hasNext(); ) {
            csv.append(it.next());
            if (it.hasNext()) {
                csv.append(",");
            }
        }
        return csv.toString();
    }

    public static String getUTCDateTime() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
        return sdf.format(new Date());
    }

}

支付页面展示

在这里插入图片描述
在这里插入图片描述

当然,回调地址可以定义自己的页面,也可以托管平台的页面。好了大概流程就结束了。
有的不太清楚回调是在哪里配置的 我在这里补上
在这里插入图片描述
https://webhook.site/#/ 方便测试回调 这里回调地址可以访问这个网址生成的虚拟站点地址 配置到商户通知URL 方便查看回调参数如下 访问地址会看到请求信息
在这里插入图片描述
在这里插入图片描述

有什么问题可以留言我会及时回复一起交流

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
java.security.NoSuchProviderException: JCE cannot authenticate the provider BC是一个错误,意味着Java加密扩展(JCE)无法验证提供者BC的身份。这个错误通常发生在项目使用了BC加密包,并且在打包运行时出现。 解决这个问题的方法有几种: 1. 确保正确引入了BC加密包:首先,确保你已经正确地将BC加密包添加到项目的依赖中,并且版本与你的项目要求的版本相匹配。你可以尝试重新下载和添加正确的BC加密包。 2. 检查权限文件:如果你的项目需要使用无限强度的加密算法,则应该确保已经下载并正确安装了“Unlimited Strength Jurisdiction Policy Files”。这些文件可以解决JCE对于强加密算法的限制。 3. 添加BouncyCastleProvider:尝试通过在代码中显式添加BouncyCastleProvider来解决问题。你可以在项目的源代码中添加以下代码: ```java Security.addProvider(new BouncyCastleProvider()); ``` 确保在使用BC加密功能之前添加这行代码。 4. 检查冲突的提供者:如果你的项目中同时使用了其他的加密提供者,例如cybersource,可能会导致冲突。请确保你的项目中没有引入冲突的加密提供者,并尝试解决冲突。 总结来说,解决java.security.NoSuchProviderException: JCE cannot authenticate the provider BC错误的关键是确保正确引入了BC加密包,检查权限文件,添加BouncyCastleProvider,并解决与其他加密提供者的冲突。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [百旺电子发票发布到服务器报错.txt](https://download.csdn.net/download/sinat_26708145/12707339)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [java.security.NoSuchProviderException: JCE cannot authenticate the provider BC](https://blog.csdn.net/m0_37986733/article/details/126475025)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [:error constructing MAC: java.lang.SecurityException: JCE cannot authenticate the provider BC](https://blog.csdn.net/qq_53276288/article/details/120553631)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值