• Chinapay 银联支付接口


    银联开发必须要开启mcrypt 和 bcmath 两个PHP扩展库的支持 如果没有就没有办法进行开发,先确认数据库是否开启扩展

    关于银联支付接口 最主要的是银行提供的秘钥和私钥,

    netpayclient.php加密文件   MerPrK.key私钥   PgPubk.key秘钥 是银联也商户签约后提供 非常重要  

    1:from表单 提交商户数据个银行  https://payment.ChinaPay.com/pay/TransGet银联生产环境接口 在测试是用银联提供的测试环境比较好

     通过require_once 加载submit页面

        <!-- 银联支付页面 -->        
                 <form action="https://payment.ChinaPay.com/pay/TransGet" method="post" target="_blank">
                   <?php require_once("chinapay/netpayclient_order_submit.php");?>
                        <div style="display: none;">
                        <input type=hidden name="MerId" value="<?php echo $merid ?>"/>
                        <input type=hidden name="OrdId" value="<?php echo $ordid ?>"/>
                        <input type=hidden name="TransAmt" value="<?php echo $transamt ?>"/>
                         <input type=hidden name="CuryId" value="<?php echo $curyid ?>"/>
                         <input type=hidden name="TransDate" value="<?php echo $transdate?>"/>
                        <input type=hidden name="TransType" value="<?php echo $transtype?>"/>
                        <input type=hidden name="Version" value="<?php echo $version?>"/>
                           <input type=hidden name="BgRetUrl" value="<?php echo $bgreturl?>"/>
                        <input type=hidden name="PageRetUrl" value="<?php echo $pagereturl?>"/>
                        <input type=hidden name="GateId" value="<?php echo $gateid?>"/>
                        <input type=hidden name="Priv1" value="<?php echo $priv1?>"/>
                        <input type=hidden name="ChkValue" value="<?php echo $chkvalue?>"/>
                        </div>
                        <li>
                            <div class="pay_boxin pay_curr">
                                <span class="left"><img src="<?php echo Yii::app()->request->baseUrl ?>/assets/default/images/unionpay.jpg" height="40px"></span>
                            <span class="pay_money right">
                                <p>支付<strong><?php echo @sprintf('%0.2f',$OrderInfo['TotalMoney'])?></strong></p>
                            </span>
                            </div>
                            <input type="submit" style="220px; height:50px; border:0px; margin:30px 0 0 500px; background: url(<?php echo Yii::app()->request->baseUrl ?>/assets/default/images/pay_quite.png) center no-repeat; cursor:pointer;" value="" >
                            <div class="pay_disno" style="margin:30px 0 0 500px;"><img src="<?php echo Yii::app()->request->baseUrl ?>/assets/default/images/pay_quite.png"></div>
                    </li>
                    </form>
    View Code

    2:netpayclient_order_submit.php 进行数据的签名验证 并且导入私钥文件 加密部分的代码可以根据商户需求进行修改

    <?php
        //header('Content-type: text/html; charset=gbk');
    
        include_once("netpayclient_config.php");
    ?>
    <title>支付交易</title>
    <?php
        //加载 netpayclient 组件
        include_once("netpayclient.php");
        //导入私钥文件, 返回值即为您的商户号,长度15位
        $merid = buildKey(PRI_KEY);
        if(!$merid) {
            echo "导入私钥文件失败!";
            exit;
        }
    
        //生成订单号,定长16位,任意数字组合,一天内不允许重复,本例采用当前时间戳,必填
        $ordid = substr($OrderInfo["PayNumber"], 1, 16);//"00" . date('YmdHis');
        //订单金额,定长12位,以分为单位,不足左补0,必填
        $transamt = padstr(str_replace(".", "", $OrderInfo['TotalMoney']),12);//padstr('1',12);
        //货币代码,3位,境内商户固定为156,表示人民币,必填
        $curyid = "156";
        //订单日期,本例采用当前日期,必填
        $transdate = date('Ymd');
        //交易类型,0001 表示支付交易,0002 表示退款交易
        $transtype = "0001";
        //接口版本号,全报文签名接口版本为20141120,必填
        $version = "20141120";
        //页面返回地址(您服务器上可访问的URL),最长80位,当用户完成支付后,银行页面会自动跳转到该页面,并POST订单结果信息,可选
        $pagereturl = "$site_url/index.php/Payment/ChinaPayReturn";
        //后台返回地址(您服务器上可访问的URL),最长80位,当用户完成支付后,我方服务器会POST订单结果信息到该页面,必填
        $bgreturl = "$site_url/index.php/Payment/ChinaPayReturn";
    
        /************************
        页面返回地址和后台返回地址的区别:
        后台返回从我方服务器发出,不受用户操作和浏览器的影响,从而保证交易结果的送达。
        ************************/
    
        //支付网关号,4位,上线时建议留空,以跳转到银行列表页面由用户自由选择,本示例选用0001农商行网关便于测试,可选
        $gateid = "";
        //备注,最长60位,交易成功后会原样返回,可用于额外的订单跟踪等,可选
        $priv1 = "";
    
        //按次序组合订单信息为待签名串
        $plain = $merid . $ordid . $transamt . $curyid . $transdate . $transtype . $version    . $bgreturl    . $pagereturl . $gateid . $priv1;
        //生成签名值,必填
        $chkvalue = sign($plain);
        if (!$chkvalue) {
            echo "签名失败!";
            exit;
        }
    ?>
    View Code

    3:netpayclient_order_feedback.php 支付应答页面 加载公钥 与私钥进行验证签名 成功银行会返回数据给商户

    <?php
        //header('Content-type: text/html; charset=gbk');
        include_once("netpayclient_config.php");
    ?>
    <title>支付应答</title>
    <h1>支付应答</h1>
    <?php
        //加载 netpayclient 组件
        include_once("netpayclient.php");
    
        //导入公钥文件
        $flag = buildKey(PUB_KEY);
        if(!$flag) {
            echo "导入公钥文件失败!";
            exit;
        }
    
        //获取交易应答的各项值
        $merid = $_REQUEST["merid"];
        $orderno = $_REQUEST["orderno"];
        $transdate = $_REQUEST["transdate"];
        $amount = $_REQUEST["amount"];
        $currencycode = $_REQUEST["currencycode"];
        $transtype = $_REQUEST["transtype"];
        $status = $_REQUEST["status"];
        $checkvalue = $_REQUEST["checkvalue"];
        $gateId = $_REQUEST["GateId"];
        $priv1 = $_REQUEST["Priv1"];
    
        if(strlen($orderno) == 16)
        {
            $orderno = "2" . $orderno;
        }
        //验证签名值,true 表示验证通过
        $flag = verifyTransResponse($merid, $orderno, $amount, $currencycode, $transdate, $transtype, $status, $checkvalue);
        if(!$flag) {
            //echo "<h2>验证签名失败!</h2>";
            //exit;
        }
        //echo "<h2>验证签名成功!</h2>";
        //交易状态为1001表示交易成功,其他为各类错误,如卡内余额不足等
        if ($status == '1001'){
            //echo "<h3>交易成功!</h3>";
            //您的处理逻辑请写在这里,如更新数据库等。
            //注意:如果您在提交时同时填写了页面返回地址和后台返回地址,且地址相同,请在这里先做一次数据库查询判断订单状态,以防止重复处理相通的订单
            $this->actionSetPayN($orderno,3);
            $this->redirect(array('/UserCenter'));
        } else {
            echo "<h3>交易失败!</h3>";
        }
    
    
    ?>
    View Code

    4:后台回调跳转

    5:netpayclient_config.php 设置页面

    <?php
        /*请按照您的实际情况配置以下各参数*/
    
        //私钥文件,在CHINAPAY申请商户号时获取,请相应修改此处,可填相对路径,下同
        define("PRI_KEY", "MerPrk.key");
        //公钥文件,示例中已经包含
        define("PUB_KEY", "PgPubk.key");
        
        /*如您已有生产密钥,请修改以下配置,默认为测试环境*/
        
        //支付请求地址(测试)
        //define("","http://payment-test.ChinaPay.com/pay/TransGet");
        //支付请求地址(生产)
        //define("","https://payment.ChinaPay.com/pay/TransGet");
        
         //取得本示例安装位置 商户的网站地址
        $site_url = "http://www.xxxx.com"//getSiteUrl();
    ?>
  • 相关阅读:
    EventBridge消息路由|高效构建消息路由能力
    技术盘点:消息中间件的过去、现在和未来
    峰会报名|从金融行业技术选型,看 RocketMQ 如何应对严苛挑战
    从旁观者到贡献者:经历 OpenYurt 的“开源之夏”,我们想让更多人体验社区的魅力
    如虎添翼!高德地图+Serverless 护航你的假日出行
    关于阿里云多活容灾的那点事
    在阿里巴巴,我们如何先于用户发现和定位 Kubernetes 集群问题?
    直播带练 | 30 分钟用阿里云容器服务和容器网络文件系统搭建 WordPress 网站
    阿里巴巴副总裁陈丽娟:我对阿里云产品生态的思考 | 云原生加速器观点
    重新理解“无容灾不上云”:应用多活将成为云原生容灾新趋势
  • 原文地址:https://www.cnblogs.com/huii/p/4726791.html
Copyright © 2020-2023  润新知