备注:以下代码基于PHP laravel框架,引用了自带的函数。array_get($array, "key") 为数组中取元素,类似于$array["key"]。快钱后端语言为java,对接快钱时遇到了一些问题,今天整理下,希望可以帮到更多的人。

一、后端拼接唤起支付url

/**

* 快钱一码付(聚合支付)相关配置

*/

$kuaiqian = [

"merchantCode" => "10210xxxxxx", //商户会员号

"merchantId" => "812310xxxxx", //商户编号

"terminalId" => "71075xxxxx", //终端编号

"key" => "xxxxxxx", //支付秘钥

"payUrl" => "https://pay.99bill.com/prod/html/agent-static/index.html", //快钱前端唤起支付url

"returnUrl" => "https://xxx/return_url", //支付成功,前端回调url

]

/**

* 拼接支付参数

* @param $orderNumber

*/

function getPayUrl($orderNumber, $money)

{

$data = [

"requestTime" => date("YmdHis"),

"externalTraceNo" => $orderNumber,

"merchantCode" => array_get($kuaiqian, "merchantCode"),

"merchantId" => array_get($kuaiqian, "merchantId"),

"terminalId" => array_get($kuaiqian, "terminalId"),

"amt" => $money,

"returnUrl" => array_get($kuaiqian, "returnUrl")."?orderNumber=".$orderNumber //前端同步回调地址

];

$sign = kuaiqian_sign($data);

$data["secretInfo"] = $sign;

$string = "";

foreach ($data as $key => $value) {

$string .= $key."=".$value."&";

}

return array_get($kuaiqian, "payUrl")."?".rtrim($string, "&");

}

/**

* 快钱支付签名

*/

function kuaiqian_sign($data)

{

ksort($data);

$res = "";

foreach ($data as $key => $value) {

if (!$value) continue; //参数值为空时不参与签名

$res .= $key."=".$value."&";

}

$stringSignTemp = $res."key=".array_get($kuaiqian, "key");

return strtoupper(md5($stringSignTemp));

}

二、回调签名(和支付、微信不同的是快钱的回调地址需要提前和业务联系配置)

/**

* 支付异步回调

* @param Request $request

*/

function payNotify(PayRepository $payRepository)

{

$request = file_get_contents("php://input");

$request = explode("&", $request);

//将回调数组转为完整数组

foreach ($request as $data) {

$tmp = explode("=", $data);

$result[array_get($tmp, "0")] = urldecode(array_get($tmp, "1"));

}

//支付回调签名验证

$signVerify = kuaiqian_notify_sign_verify($result);

//签名不通过

if (!$signVerify) {

return "1";

}

//系统内部订单号

$orderNumber = array_get($result, "externalTraceNo");

//订单已经支付成功,不需要重复回调

if (array_get($payOrder, "status") != PayOrder::PAY_ORDER_STATUS_NOT) {

return "0";

}

if (array_get($result, "processFlag") === "0") { //支付成功,处理内部业务逻辑

$result = "success"; //处理支付成功以后的业务逻辑

if (!$result) {

return "1";

} else {

return "0";

}

} else { //支付不成功,也不允许再次回调

return "0";

}

}

/**

* 快钱支付接口通知验签结果校验

* @param $datas array 快钱回调完整报文

*/

function kuaiqian_notify_sign_verify($datas)

{

$signature = array_get($datas, "signature"); //获取签名

//获取参与验签的数组节点(array_only()为laravel封装的函数,获取数组中指定键的参数,可以自己封装。)

$datas = array_only($datas, ["processFlag", "txnType", "orgTxnType", "amt", "externalTraceNo", "orgExternalTraceNo",

"terminalOperId", "authCode", "RRN", "txnTime", "shortPAN", "responseCode", "cardType", "issuerId"]);

//节点值为空时屏蔽节点,不需要参与验签

foreach ($datas as $key => $value) {

if ($datas[$key] === "") {

unset($datas[$key]);

}

}

$result = implode("", $datas); //等待验签字符串拼接

$publicKey = openssl_get_publickey(file_get_contents(public_path("xxxx/public.pem"))); #特别强调:验签公钥快钱给的是.cer格式,PHP需要转为pem(openssl x509 -inform der -in xx.cer xx.pem)

return openssl_verify($result, base64_decode($signature), $publicKey);

}

三、后记

快钱后端为Java,导致回调验签的时候费了好大力气才搞定,今天整理了下,需要的伙伴可以试试,有问题可以私我。(快钱做大做强了,但技术对接服务这块真的不怎么样,坑死。)

快钱 java demo_快钱聚合支付(一码付)对接demo相关推荐

  1. 聚合支付收款码怎么申请

    目前消费者的付款方式多样,聚合支付成了商家的必须,不然得来回切换收款方式,这是很麻烦的.聚合支付收款码可以避免在一个收银台放置较多二维码,节省了空间.而且避免了提现,直接进入银行卡后可以让用户及时了解 ...

  2. 聚合支付源码怎么选择

    随着聚合支付的热潮席卷中国,越来越多有想法的创业者投身到聚合支付行业当中,打算占一杯羹.他们首要解决的就是聚合支付系统的开发问题,其中聚合支付源代码的设置则是一切发展的奠基.所以,什么是聚合支付源码, ...

  3. 银行和服务商聚合支付收款码的区别在哪?

    数据显示,从2014年到2020年,人们对移动支付的依赖性增加,从零开始促进了聚合支付行业交易规模的快速增长.2014年,聚合支付市场交易规模仅为0.1万亿元左右,2020年已增至63万亿元.使用聚合 ...

  4. java版聚合支付源码Spring Cloud+Spring Boot+mybatis+security+uniapp+Redis+MQ+VR全景+b2b2c多商家入驻前后端分离商城源码

    @源码地址来源: https://minglisoft.cn/honghu/business.html 电商微信支付.支付宝支付.余额支付代码 package com.honghu.cloud.con ...

  5. java对接聚合支付(计全付)

    目录 背景 准备工作,注册获取开发参数 开发 下单接口 回调接口 查询订单接口 背景 项目中本来是使用微信和支付宝分开的收款码收款,现在需要实现一张二维码图片,微信/支付宝 都能扫码付款 这里可以先看 ...

  6. java三路快排,java二路快排很慢

    老师,以下是我二路快排的java代码 public class quickSortTwoway { public quickSortTwoway() {}; public static void qu ...

  7. 运行sql快还是java代码快,让Java代码跑得更快

    1.将一些系统资源放在池中,如数据库连 接,线程等.在standalone的应用中,数据库连接池可以使用一些开源的连接池实现,如C3P0,proxool和DBCP等,在运行在容器中的应 用这可以使用服 ...

  8. 易宝java面试_java 易宝支付源码 (已测试成功,有测试步骤图片)

    [实例简介] 1.登陆页面填入信息 选择银行. 2.网上找的新的ID,和密码加入到配置文件中使用 3.点击提交后连接到易宝的支付页面. 4.通过建行支付的连接(显示建行已经扣了0.01元) http: ...

  9. 小呆聚合支付源码开源修正版支持易支付对接各大网站,APP离线完美回调

    @全体成员v6.4.1升级到v6.4.2 1.增加两套支付模版,用户可以后台自由切换模式 2.优化默认支付模版,增加订单来源,商品名称 3.增加app在各个手机上安装指引教程 4.优化其他细节 @全体 ...

最新文章

  1. 2019年度最受欢迎中国开源软件公布
  2. 【大牛疯狂教学】cdhkafka打开的文件描述符临界阈值
  3. 运维基础(13)日志切割工具 Logrotate
  4. 组态王接入多比物联网云平台
  5. 南邮CTF--bypass again
  6. 二叉树的递归与非递归
  7. [转]在Sql Server中将字符串分割成表格数据示例
  8. 联想网络同传系统用户手册(联想EDU应用用户手册)[联想硬盘保护,联想网络控制工具]
  9. atan和atan2的区别-Matlab三角函数
  10. 在 Java 应用程序中访问USB设备
  11. web页面上联系QQ客服功能实现——一行代码搞定
  12. 本地用微信测试公众号开发对接微信支付思路
  13. Nanopore 纳米孔 测序数据处理 微生物 16S全长 Centrifuge的安装和使用
  14. sqlserver 2017 还原遇到报错The operating system returned the error ‘21(设备未就绪。)‘
  15. (转)纵观国内外证券公司IT发展史
  16. K8S中的cordon、uncordon和drain node标签 节点标签
  17. R语言ggplot2 |绘制高颜值森林图
  18. matlab表示sa函数,SA:T1编写主函数法和T2Matlab自带的SA工具箱GUI法,两种方法实现对二元函数优化求解——Jason niu...
  19. 现场签约及达成合作意向金额6.8亿多元 山东104家企业闪耀第十五届“中博会”
  20. XShell 7 绿色版一键安装教程

热门文章

  1. [附源码]计算机毕业设计Node.js-童装在线销售推荐系统(程序+LW)
  2. uploadify使用详解
  3. 开启宝蓝德中间件的 开发者模式和热部署模式
  4. Audio:喇叭的碧海潮生曲
  5. 互贷新规·助贷涅槃·解析与展望
  6. DRF自动生成OpenAPI文档
  7. Unity Sockect实现画面实时传输
  8. 《Scrum敏捷游戏开发》读书笔记
  9. LNMP架构搭建过程(超详细!)
  10. rust标准服在哪捡枪_《Rust》全武器道具对建筑伤害一览