银联支付(网银h5)

杉德全支付平台

需要的资料:

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

你可能感兴趣的:(php)