银联支付(网银h5)

6 篇文章 1 订阅

杉德全支付平台

需要的资料:

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文件下,然后配置好,获取私钥路径

<?php
/**
 * Created by PhpStorm.
 * User: jmk
 * Date: 2018/11/13
 * Time: 18:18
 */

namespace app\v1\controller;


use think\Controller;
use think\Exception;

class UnionPay extends Controller
{
    protected $mid='100211701160001';//商户号 100211701160001(官方提供的测试账号)
    protected $notifyUrl='';//异步回调地址 (回调地址必须配置,否则会报错)
    protected $frontUrl='';//同步回调地址
    /**
     * 银联支付
     */
    public function WebPay(){
        $bank_num='';//银行卡号
        $data = array(
            'head' => 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦夏夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值