杉德全支付平台
需要的资料:
1.商户公钥 获取方式:先安装证书(注意:证书在收到邮件后14天内下载,并且只能下载一次),然后用IE打开https://cs.cfca.com.cn/cgi-bin/userCertDownload/v_input.do?displayAgreement=true 点击“工具—Internet选项”,查看证书,注意查看证书中的商户号是否与邮箱中发送的商户号一致,然后导出公钥
2.商户私钥 跟上边公钥导出方式一样
3.私钥证书密码 此密码是公钥导出时设置的密码
开始步骤
1.根据收到的开通邮件,找到登陆CFCA官网数字证书下载平台https://cs.cfca.com.cn/cgi-bin/userCertDownload/v_input.do?displayAgreement=true,使用本邮件提供的证书序列号和授权码,下载加密证书安装,然后再按流程导出商户公钥(后缀为 .cer)和商户私钥(文件后缀为.pfx)文件 公钥私钥导出手册:https://open.sandpay.com.cn/developmentAccess/guide?msg=6684
2.使用邮箱中的商户号去开放平台注册账号,然后在开放平台-参数设置中上传该公钥,完成编辑后请刷新页面查看审核状态。状态显示为“已审核”后1小时左右生效,请耐心等待。(需要注册并登录,注册时使用开户邮件中的商户号注册)
3.找到开发文档 https://open.sandpay.com.cn//developmentAccess/moredoc?openpage=demo 接口文档中提供有demo 然后下载对应的demo 文件
4.将之前的 公钥,私钥,私钥密码,商户号配置好,将下载好的公钥,私钥文件放到项目cert文件下,然后配置好,获取私钥路径
array(
'version' => '1.0',
'method' => 'sandpay.trade.pay',
'productId' => '00000008',
'accessType' => '1',
'mid' => $this->mid,
'channelType' => '07',
'reqTime' => date('YmdHis', time())
),
'body' => array(
// 'orderCode' => $_GET['order_id'],//商户订单号
'orderCode' => time(),//商户订单号
'totalAmount' =>'000000000001',//订单金额
'subject' => '商城',//订单标题
'body' => '',//订单描述
'txnTimeOut' => 20181116202020,//支付超时时间
'payMode' => 'sand_h5',//支付模式 sand_h5 h5银行卡支付 bank_pc 银行卡网关支付
'payExtra' => json_encode(array('cardNo' =>$bank_num)),//银行卡号
'clientIp' => get_client_ip(),//客户端IP
'notifyUrl' => $this->notifyUrl,//异步回调
'frontUrl' => $this->frontUrl,//同步回调
'extend' => ''
)
);
// step2: 私钥签名
$prikey = loadPk12Cert(PRI_KEY_PATH, CERT_PWD);
$sign = sign($data, $prikey);
// step3: 拼接post数据
$post = array(
'charset' => 'utf-8',
'signType' => '01',
'data' => json_encode($data),
'sign' => $sign
);
// step4: post请求
$result = http_post_json(API_HOST . '/order/pay', $post);
$arr = parse_result($result);
//step5: 公钥验签
$pubkey = loadX509Cert(PUB_KEY_PATH);
try {
verify($arr['data'], $arr['sign'], $pubkey);
} catch (Exception $e) {
echo $e->getMessage();
exit;
}
// step6: 获取credential
$data = json_decode($arr['data'], true);
if ($data['head']['respCode'] == "000000") {
$credential = $data['body']['credential'];
return $credential;
} else {
print_r($arr['data']);
}
}
/**
* 异步回调
*/
public function notifyUrl(){
$data = file_get_contents("php://input");
if(!empty($data)){
Checking::writeLog('回调开始','','bank.txt');
parse_str($data,$backData);
if($backData['data']){
$arrData = json_decode($backData['data'],true);
$orderCode = $arrData['body']['orderCode'];
$where = [
'pay_order_num' => $orderCode,
'status' => 1
];
$info = Db::name('orders')->where($where)->find();
Checking::writeLog('回调开始', '订单号-' . json_encode($info),'bank.txt');
if ($info['status'] == 1) {
Db::startTrans();
try {
#处理逻辑
Db::commit();
Checking::writeLog('回调完成', '商品专区-' . $info['sale_area'],'bank.txt');
exit('success');
} catch (Exception $exception) {
Db::rollback();
Checking::writeLog($exception->getMessage(), '商品专区-' . $info['sale_area'],'bank.txt');
exit('fail');
}
}
}
}
}
/**
* 同步回调
*/
public function frontUrl(){
}
}
下边放上常见的错误:
1. 签名失败
可能原因
(1)请确认您从cfca导出的商户公钥已报备,已报备后大约1小时生效;
(2)请确认您项目中使用的公钥是杉德公钥,(sand.cer 可在报备页面直接下载);
(3)请确认您项目中使用的私钥和报备的公钥是一对,且与商户号对应,如不确认,请重新导出报备;
(4)请确认使用了正确的商户号;
(5)中英文或特殊字符问题,异步地址不能含有特殊符号(最后面不能加/)。
项目代码链接 https://gitee.com/jmk/payment