20180803UnionPay银联支付,接入银联支付

by admin on 2019年2月18日

LNMP环境下支付的银联支付(测试环境)

 

TP3.2.3
接入银联支付

日前的3个网站项目,须求贯彻20万已上在线付款,支付宝和微信都限额,于是只能想办法搞大额支付了,演示你可以参考下那几个:http://www.erdangjiade.com/php/2751.html

本文实例讲述了php银联网页支付落成方式。分享给大家供大家参考。具体分析如下:
此地介绍的银联WAP支付作用,仅限消费作用。

1.准备条件

 

    

      a.银联支持API:

      

      b.选用开发软件包

      图示:bf88必发唯一官网 1

      c.我选择:

        网关支付开发:

      d.获取测试音讯

        第②步:在“笔者的制品”选拔测试 项目

        第贰步:在“测试参数”中收获测试数据

        图示:bf88必发唯一官网 2

          

    项目接入银联支付的长河,
在此记录下,希望能支持开发盆友平坑。

一 、先去报名
        支付    

  1. PHP代码如下:

2.代码配置

      1.下载网关支付DEMO

      bf88必发唯一官网 3

       2.修改sdk/acp_sdk.ini 配置文件消息

  • ;后台布告地址,填写接收银联后台公告的地方,必须外网能访问
  • acpsdk.backUrl=
    • ;前台文告地址,填写处理银联前台文告的地方,必须外网能访问
  • acpsdk.frontUrl=
    • ;;;;;;;;;;;;;;;;;;;;;;;;;入网测试环境签名证书配置
      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  • ; 多证件的情状评释路径为代码钦点,可不对此块做安插。
  • ;
    签名证书路径,必须采纳相对路径,固然不想采用相对路径,可以自行落成相对路径获取证书的方式;测试评释全部商行共用开发包中的测试签名证书,生产环境请从cfca下载得到。
  • ;
    测试环境证书放在assets/测试环境证书/文件夹下,请复制到d:/certs文件夹。生产环境证书由业务部门邮件发送。
  • ; windows样例:
  • acpsdk.signCert.path=D:/certs/acp_test_sign.pfx
  • ;
    linux样例(注意:在linux下读取证件须要确保障书有被运用读的权杖)(后续其余路线配置也同此条表明)
  • ;acpsdk.signCert.path=/SERVICE01/usr/ac_frnas/conf/ACPtest/acp_test_sign.pfx
    • ;
      签名证书密码,测试环境固定000000,生产条件请修改为从cfca下载的业内证书的密码,正式环境证书密码位数需小于等于伍位,否则上传出商家服务网站会破产
  • acpsdk.signCert.pwd=000000
    • ;;;;;;;;;;;;;;;;;;;;;;;;;;加密证书配置;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  • ; 敏感信息加密证书路径(商家号开通了商行对敏感新闻加密的权力,必要对
    卡号accNo,pin和phoneNo,cvn2,expired加密(若是那个上送的话),对灵活新闻加密应用)
  • acpsdk.encryptCert.path=d:/certs/acp_test_enc.cer
    • ;;;;;;;;;;;;;;;;;;;;;;;;;;验签证书配置;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  • ;
    验签中级证书(证书放在assets/测试环境证书/文件夹下,请复制到d:/certs文件夹)
  • acpsdk.middleCert.path=D:/certs/acp_test_middle.cer
  • ;
    验签根证书(证书放在assets/测试环境证书/文件夹下,请复制到d:/certs文件夹)
  • acpsdk.rootCert.path=D:/certs/acp_test_root.cer

       3.将demo/中多个文件代码不难修改(本身只保留其中php代码),就兑现银联支付流程。

       bf88必发唯一官网 4

       4.在搭建的地面环境中一向访问xxx/Form_6_2_FrontConsume.php。成功发起支付

        发送支付请求:

  • private function webPay($datas){
  • global $UnionPayInfo;
  • $params = array(
  • //以下消息非新鲜情状不必要改变
  • ‘version’ =>
    com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->version,
    //版本号
  • ‘encoding’ => ‘utf-8’, //编码格局
  • ‘txnType’ => ’01’, //交易类型
  • ‘txnSubType’ => ’01’, //交易子类
  • ‘bizType’ => ‘000201’, //业务类型
  • ‘frontUrl’ =>
    com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->frontUrl,
    //前台布告地址
  • ‘backUrl’ =>
    com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->backUrl,
    //后台布告地址
  • ‘signMethod’ =>
    com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->signMethod,
    //签名方法
  • ‘channelType’ => ’07’, //渠道类型,07-PC,08-手机
  • ‘accessType’ => ‘0’, //接入类型
  • ‘currencyCode’ => ‘156’, //交易币种,境内商户固定156
    • //TODO 以下音信要求填写
  • ‘merId’ => $UnionPayInfo[‘merId’],
    //卖家代码,请改自身的测试专营商号,此处暗中认同取demo演示页面传递的参数
  • ‘orderId’ => $datas[“orderId”],
    //商家订单号,8-32人数字字母,不可以含“-”或“_”,此处暗许取demo演示页面传递的参数,可以自行定制规则
  • ‘txnTime’ => date(‘YmdHis’),
    //订单发送时间,格式为YYYYMMDDhhmmss,取上海时间,此处专擅认同取demo演示页面传递的参数
  • ‘txnAmt’ => $datas[“txnAmt”],
    //交易金额,单位分,此处默许取demo演示页面传递的参数
    • // 订单超时时间。
  • //
    超越此时间后,除网银交易外,其他交易银联系统会拒绝受理,指示超时。
    跳转银行网银交易假诺超时后交易得逞,会自动退款,大概五个工作日金额返还到持卡人账户。
  • // 此时间提议取支付时的香港时间加16分钟。
  • //
    领先超时时间调查询接口应答origRespCode不是A6大概00的就足以断定为失利。
  • ‘payTimeout’ => date(‘YmdHis’, strtotime(‘+15 minutes’)),
    • );
  • com\unionpay\acp\sdk\AcpService::sign ( $params );
  • $uri =
    com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->frontTransUrl;
  • $html_form =
    com\unionpay\acp\sdk\AcpService::createAutoFormHtml( $params,
    $uri );
  • 20180803UnionPay银联支付,接入银联支付。echo $html_form;

       5.下载德姆o页面底部有个 视频参考(很有用)

 

   
银联SKD链接:

跳转中…

复制代码 代码如下:

    首先大家先下载官方提供的SDK 
,下载好刺探压采纳版本 ,里面有PHP  java  .net 
这里我们当然是挑选PHP版本的,接入前大家先配环境,它要大家PHP

    %s            document.onreadystatechange
=function(){if(document.readyState ==”complete”) {               
document.pay_form.submit();            }        };    HTML;/**     
* 创设活动提交HTML表单      *@returnstring     
*/publicfunctioncreatePostForm(){$this->params[‘signature’]
=$this->sign();        $input =”;foreach($this->paramsas$key
=> $item) {            $input .=”\t\t\n”;       
}returnsprintf($this->formTemplate,$this->config[‘frontUrl’],
$input);    }/**      * 验证签名      * 验签规则:      *
除signature域之外的全部品种都不能不到庭验签      *
依照key值根据字典排序,然后用&拼接key=value格局待验签字符串;      *
然后对待验签字符串使用sha1算法做摘要;      *
用银联公钥对摘要和署名音信做验签操作      *      *@throws\Exception 
    *@returnbool      */publicfunctionverifySign(){        $publicKey
=$this->getVerifyPublicKey();        $verifyArr
=$this->filterBeforSign();        ksort($verifyArr);       
$verifyStr =$this->arrayToString($verifyArr);        $verifySha1 =
sha1($verifyStr);        $signature =
base64_decode($this->params[‘signature’]);        $result =
openssl_verify($verifySha1, $signature, $publicKey);if($result ===-1)
{thrownew\Exception(‘Verify Error:’.openssl_error_string());       
}return$result ===1?true:false;    }/**      * 取签名证书ID(SN)     
*@returnstring     
*/publicfunctiongetSignCertId(){return$this->getCertIdPfx($this->config[‘signCertPath’]); 
  }/**      * 签名数据      * 签名规则:      *
除signature域之外的具备项目都不只怕不参预签约      *
根据key值根据字典排序,然后用&拼接key=value形式待签名字符串;      *
然后对待签名字符串使用sha1算法做摘要;      *
用银联公布的私钥对摘要做奇骏SA签名操作      *
签名结果用base64编码后放在signature域      *     
*@throws\InvalidArgumentException      *@returnmultitype|string     
*/privatefunctionsign(){        $signData
=$this->filterBeforSign();        ksort($signData);       
$signQueryString
=$this->arrayToString($signData);if($this->params[‘signMethod’]
==01) {//签名以前先用sha1处理//echo $signQueryString;exit;$datasha1 =
sha1($signQueryString);            $signed
=$this->rsaSign($datasha1);       
}else{thrownew\InvalidArgumentException(‘Nonsupport Sign Method’);     
  }return$signed;              }/**      * 数组转换来字符串     
*@paramarray $arr      *@returnstring     
*/privatefunctionarrayToString($arr){        $str
=”;foreach($arras$key => $value) {            $str .=
$key.’=’.$value.’&’;        }returnsubstr($str,0, strlen($str) -1);   
}/**20180803UnionPay银联支付,接入银联支付。      * 过滤待签名数据      * signature域不参与签字      *     
*@returnarray      */privatefunctionfilterBeforSign(){        $tmp
=$this->params;unset($tmp[‘signature’]);return$tmp;    }/**     
* OdysseySA签名数据,并base64编码      *@paramstring $data 待签名数据     
*@returnmixed      */privatefunctionrsaSign($data){        $privatekey
=$this->getSignPrivateKey();        $result = openssl_sign($data,
$signature, $privatekey);if($result) {returnbase64_encode($signature); 
      }returnfalse;    }/**      * 取.pfx格式证书ID(SN)     
*@returnstring      */privatefunctiongetCertIdPfx($path){       
$pkcs12certdata = file_get_contents($path);       
openssl_pkcs12_read($pkcs12certdata,
$certs,$this->config[‘signCertPwd’]);        $x509data =
$certs[‘cert’];        openssl_x509_read($x509data);       
$certdata =
openssl_x509_parse($x509data);return$certdata[‘serialNumber’];   
}/**      * 取.cer格式证书ID(SN)      *@returnstring     
*/privatefunctiongetCertIdCer($path){        $x509data =
file_get_contents($path);        openssl_x509_read($x509data);     
  $certdata =
openssl_x509_parse($x509data);return$certdata[‘serialNumber’];   
}/**      * 取签名证书私钥      *@returnresource     
*/privatefunctiongetSignPrivateKey(){        $pkcs12 =
file_get_contents($this->config[‘signCertPath’]);       
openssl_pkcs12_read($pkcs12,
$certs,$this->config[‘signCertPwd’]);return$certs[‘pkey’];   
}/**      * 取验证签名证书      *@throws\InvalidArgumentException 
    *@returnstring     
*/privatefunctiongetVerifyPublicKey(){//先判断配置的验签证书是不是银联重临内定的表明是或不是一律if($this->getCertIdCer($this->config[‘verifyCertPath’])
!=$this->params[‘certId’])
{thrownew\InvalidArgumentException(‘Verify sign cert is incorrect’);   
    }returnfile_get_contents($this->config[‘verifyCertPath’]);   
        } } [2].[代码] 配置示例 跳至 [1] [2] [3]
[4]配制事例//银联支付设置’unionpay’=>
[//测试环境参数’frontUrl’=>”
=> ”,
//单笔查询请求地址’signCert帕特h’=>__DIR__.’/../keys/unionpay/test/sign/700000000000001_acp.pfx’,//签名证书路径’signCertPwd’=>’000000′,//签名证书密码’verifyCertPath’=>__DIR__.’/../keys/unionpay/test/verify/verify_sign_acp.cer’,//验签证书路径’merId’=>’xxxxxxx’,//正式环境参数//’frontUrl’
=> ”,
//前台交易请求地址//’singleQueryUrl’ =>
”,
//单笔查询请求地址//’signCertPath’ =>
__DIR__.’/../keys/unionpay/test/sign/PM_700000000000001_acp.pfx’,
//签名证书路径//’signCertPwd’ => ‘000000’,
//签名证书密码//’verifyCertPath’ =>
__DIR__.’/../keys/unionpay/test/verify/verify_sign_acp.cer’,
//验签证书路径//’merId’ => ‘xxxxxxxxx’,
//商家代码],支付事例$unionPay =newUnionPay(); $unionPay->config =
Yii::$app->params[‘unionpay’];//下面的安顿$unionPay->params =
[‘version’=>’5.0.0′,//版本号’encoding’=>’UTF-8′,//编码格局’certId’=>
$unionPay->getSignCertId(),//证书ID’signature’=>”,//签名’signMethod’=>’01’,//签名格局’txnType’=>’01’,//交易类型’txnSubType’=>’01’,//交易子类’bizType’=>’000201′,//产品类型’channelType’=>’08’,//渠道类型’frontUrl’=>
Url::toRoute([‘payment/unionpayreturn’],true),//前台文告地址’backUrl’=>
Url::toRoute([‘payment/unionpaynotify’],true),//后台布告地址//’frontFailUrl’
=> Url::toRoute([‘payment/unionpayfail’], true),
//失败交易前台跳转地址’accessType’=>’0′,//接入类型’merId’=>
Yii::$app->params[‘unionpay’][‘merId’],//商行代码’orderId’=>
$orderNo,//专营商订单号’txn提姆e’=>
date(‘YmdHis’),//订单发送时间’txnAmt’=> $sum
*100,//交易金额,单位分’currencyCode’=>’156′,//交易币种];         
$html = $unionPay->createPostForm();异步布告示例$unionPay
=newUnionPay(); $unionPay->config =
Yii::$app->params[‘unionpay’];          $unionPay->params =
Yii::$app->request->post();//银联提交的参数if(empty($unionPay->params))
{return’fail!’; }if($unionPay->verifySign() &&
$unionPay->params[‘respCode’] ==’00’) {//…….}

<?php
namespace common\services;
class UnionPay
{
    /**
     * 支付配置
     * @var array
     */
    public $config = [];
    /**
     * 支付参数,提交到银联对应接口的持有参数
     * @var array
     */
    public $params = [];
    /**
     * 自动提交表单模板
     * @var string
     */
    private $formTemplate = <<<‘HTML’
<!DOCTYPE HTML>
<html>
<head>
    <meta charset=”utf-8″>
    <title>支付</title>
</head>
<body>
    <div style=”text-align:center”>跳转中…</div>
    <form id=”pay_form” name=”pay_form” action=”%s”
method=”post”>
        %s
    </form>
    <script type=”text/javascript”>
        document.onreadystatechange = function(){
            if(document.readyState == “complete”) {
                document.pay_form.submit();
            }
        };
    </script>
</body>
</html>
HTML;
/**
* 创设活动提交HTML表单
* @return string
*/
public function createPostForm()
{
        $this->params[‘signature’] = $this->sign();
        $input = ”;
        foreach($this->params as $key => $item) {
            $input .= “\t\t<input type=\”hidden\”
name=\”{$key}\” value=\”{$item}\”>\n”;
        }
        return sprintf($this->formTemplate,
$this->config[‘frontUrl’], $input);
}
/**
* 验证签名
* 验签规则:
* 除signature域之外的富有类型都不可以不参预验签
* 依据key值根据字典排序,然后用&拼接key=value格局待验签字符串;
* 然后对待验签字符串使用sha1算法做摘要;
* 用银联公钥对摘要和签署音信做验签操作
*
* @throws \Exception
* @return bool
*/
public function verifySign()
{
        $publicKey = $this->getVerifyPublicKey();
        $verifyArr = $this->filterBeforSign();
        ksort($verifyArr);
        $verifyStr = $this->arrayToString($verifyArr);
        $verifySha1 = sha1($verifyStr);
        $signature = base64_decode($this->params[‘signature’]);
        $result = openssl_verify($verifySha1, $signature,
$publicKey);
        if($result === -1) {
            throw new \Exception(‘Verify
Error:’.openssl_error_string());
        }
        return $result === 1 ? true : false;
}
/**
* 取签名证书ID(SN)
* @return string
*/
public function getSignCertId()
{
        return
$this->getCertIdPfx($this->config[‘signCertPath’]);
}  
/**
* 签名数据
* 签名规则:
* 除signature域之外的拥有类型都无法不到庭签约
* 根据key值按照字典排序,然后用&拼接key=value方式待签名字符串;
* 然后对待签名字符串使用sha1算法做摘要;
* 用银联发布的私钥对摘要做本田UR-VSA签名操作
* 签名结果用base64编码后放在signature域
*
* @throws \InvalidArgumentException
* @return multitype|string
*/
private function sign() {
        $signData = $this->filterBeforSign();
        ksort($signData);
        $signQueryString = $this->arrayToString($signData);
        if($this->params[‘signMethod’] == 01) {
            //签名在此以前先用sha1甩卖
            //echo $signQueryString;exit;
            $datasha1 = sha1($signQueryString);
            $signed = $this->rsaSign($datasha1);
        } else {
            throw new \InvalidArgumentException(‘Nonsupport Sign
Method’);
        }
        return $signed;
}
/**
* 数组转换来字符串
* @param array $arr
* @return string
*/
private function arrayToString($arr)
{
        $str = ”;
        foreach($arr as $key => $value) {
            $str .= $key.’=’.$value.’&’;
        }
        return substr($str, 0, strlen($str) – 1);
}
/**
* 过滤待签名数据
* signature域不参预签字
*
* @return array
*/
private function filterBeforSign()
{
        $tmp = $this->params;
        unset($tmp[‘signature’]);
        return $tmp;
}
/**
* RAV4SA签名数据,并base64编码
* @param string $data 待签名数据
* @return mixed
*/
private function rsaSign($data)
{
        $privatekey = $this->getSignPrivateKey();
        $result = openssl_sign($data, $signature, $privatekey);
        if($result) {
            return base64_encode($signature);
        }
        return false;
}
/**
* 取.pfx格式证书ID(SN)
* @return string
*/
private function getCertIdPfx($path)
{
        $pkcs12certdata = file_get_contents($path);
        openssl_pkcs12_read($pkcs12certdata, $certs,
$this->config[‘signCertPwd’]);
        $x509data = $certs[‘cert’];
        openssl_x509_read($x509data);
        $certdata = openssl_x509_parse($x509data);
        return $certdata[‘serialNumber’];
}
/**
* 取.cer格式证书ID(SN)
* @return string
*/
private function getCertIdCer($path)
{
        $x509data = file_get_contents($path);
        openssl_x509_read($x509data);
        $certdata = openssl_x509_parse($x509data);
        return $certdata[‘serialNumber’];
}
/**
* 取签名证书私钥
* @return resource
*/
private function getSignPrivateKey()
{
        $pkcs12 =
file_get_contents($this->config[‘signCertPath’]);
        openssl_pkcs12_read($pkcs12, $certs,
$this->config[‘signCertPwd’]);
        return $certs[‘pkey’];
}
/**
* 取验证签名证书
* @throws \InvalidArgumentException
* @return string
*/
private function getVerifyPublicKey()
{
        //先判断配置的验签证书是否银联重临内定的评释是或不是相同
        if($this->getCertIdCer($this->config[‘verifyCertPath’])
!= $this->params[‘certId’]) {
            throw new \InvalidArgumentException(‘Verify sign cert is
incorrect’);
        }
        return
file_get_contents($this->config[‘verifyCertPath’]bf88必发唯一官网,);      
    }
}

  的本子 在5.3之上,并且需打开环境的curl、openssl成效。

  1. 陈设示范    

   然后就是它提供的测试注明了,默许在window系统是身处D:/certs
,意思是在您的计算机的D创制多少个名为certs
的公文夹,然后将5个证件放进去,测试的名为

复制代码 代码如下:

  acp_test_enc.cer  acp_test_middle.cer  acp_test_root.cer  acp_test_sign.pfx
,在创立二个名为logs文件夹D:/logs/ 
放支付生成的日志文件,linux中请

//银联支付设置
 ‘unionpay’ => [
     //测试环境参数
     ‘frontUrl’ =>
”,
//前台交易请求地址
     //’singleQueryUrl’ =>
”,
//单笔查询请求地址
     ‘signCertPath’ =>
__DIR__.’/../keys/unionpay/test/sign/700000000000001_acp.pfx’,
//签名证书路径
     ‘signCertPwd’ => ‘000000’, //签名证书密码
     ‘verifyCertPath’ =>
__DIR__.’/../keys/unionpay/test/verify/verify_sign_acp.cer’,
//验签证书路径
     ‘merId’ => ‘xxxxxxx’,
     //正式环境参数
     //’frontUrl’ =>
”,
//前台交易请求地址
     //’singleQueryUrl’ =>
”,
//单笔查询请求地址
     //’signCertPath’ =>
__DIR__.’/../keys/unionpay/test/sign/PM_700000000000001_acp.pfx’,
//签名证书路径
     //’signCertPwd’ => ‘000000’, //签名证书密码
     //’verifyCertPath’ =>
__DIR__.’/../keys/unionpay/test/verify/verify_sign_acp.cer’,
//验签证书路径
     //’merId’ => ‘xxxxxxxxx’, //商行代码
 ],

 修改成Linux中的路径。

  1. 付出示例    

  如图:

复制代码 代码如下:

  bf88必发唯一官网 5

$unionPay = new UnionPay();
$unionPay->config = Yii::$app->params[‘unionpay’];//上边的安顿
$unionPay->params = [
    ‘version’ => ‘5.0.0’, //版本号
    ‘encoding’ => ‘UTF-8’, //编码格局
    ‘certId’ => $unionPay->getSignCertId(), //证书ID
    ‘signature’ => ”, //签名
    ‘signMethod’ => ’01’, //签名方式
    ‘txnType’ => ’01’, //交易类型
    ‘txnSubType’ => ’01’, //交易子类
    ‘bizType’ => ‘000201’, //产品类型
    ‘channelType’ => ’08’,//渠道类型
    ‘frontUrl’ => Url::toRoute([‘payment/unionpayreturn’], true),
//前台通告地址
    ‘backUrl’ => Url::toRoute([‘payment/unionpaynotify’], true),
//后台文告地址
    //’frontFailUrl’ => Url::toRoute([‘payment/unionpayfail’],
true), //失利交易前台跳转地址
    ‘accessType’ => ‘0’, //接入类型
    ‘merId’ => Yii::$app->params[‘unionpay’][‘merId’],
//商行代码
    ‘orderId’ => $orderNo, //商行订单号
    ‘txn提姆e’ => date(‘YmdHis’), //订单发送时间
    ‘txnAmt’ => $sum * 100, //交易金额,单位分
    ‘currencyCode’ => ‘156’, //交易币种
];
$html = $unionPay->createPostForm();

    你可以在assets文件夹中找到您要的证书,测试环境官方提供两个阐明,生产条件官方提供七个,还个签名证书就是后缀为.pfx
的急需您去你的银联那里申请

  1. 异步公布告例

  下载对应的你还亟需可以需求解签名证书的密码
和商贩号 , 这一个后边都会提到的。

复制代码 代码如下:

    在接下来大家将名为SDK文件夹中的七个公文放到大家项目放到
ThinkPHP\Library\Vendor\Yunpay 的文书夹中

$unionPay = new UnionPay();
$unionPay->config = Yii::$app->params[‘unionpay’];
$unionPay->params = Yii::$app->request->post();
//银联提交的参数
if(empty($unionPay->params)) {
    return ‘fail!’;
}
if($unionPay->verifySign() && $unionPay->params[‘respCode’] ==
’00’) {
    //…….
}

    bf88必发唯一官网 6

期待本文所述对我们的php程序设计有着协理。

     写逻辑代码前您还得前计划好你的acp_sdk.ini 文件
,文件之中都写的很了解,那里就不一一解释了,那里是本人的开销代码

您可能感兴趣的稿子:

  • PHP开发微信支付的代码分享
  • php支付宝接口用法分析
  • php举行支付宝支付中return_url和notify_url的分别分析
  • php微信支付之APP支付办法
  • ThinkPHP完毕支付宝接口作用实例
  • 微信支付PHP
    SDK之微信公众号支付代码详解
  • PHP达成的中信银行网银在线支付接口ECSHOP插件和采纳例子
  • php购物网站开发paypal使用格局
  • 动用php达成快钱支付功用(涉及到接口)
  • php微信支付接口开发顺序
  • php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
  • php版银联支付接口开发分明教程

    

//银联充值操作
    public function pay()
    {
        header ( 'Content-type:text/html;charset=utf-8' );
        Vendor('Yunpay.acp_service');

        //前台通知地址
        $frontUrl = "http://".I("server.HTTP_HOST")."/Assets/rechargedetail";
        //后台通知地址
        $backUrl = "http://".I("server.HTTP_HOST");
        $params = array(
            //以下信息非特殊情况不需要改动
            'version' => \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->version,          //版本号
            'encoding' => 'utf-8',                                                              //编码方式
            'txnType' => '01',                                                                  //交易类型
            'txnSubType' => '01',                                                              //交易子类
            'bizType' => '000201',                                                              //业务类型
            'frontUrl' =>  $frontUrl,                                                          //前台通知地址
            'backUrl' =>   $backUrl,                                                          //后台通知地址
            'signMethod' => \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->signMethod,    //签名方法
            'channelType' => '08',                                                             //渠道类型,07-PC,08-手机
            'accessType' => '0',                                                                //接入类型
            'currencyCode' => '156',    
             // 超过超时时间调查询接口应答origRespCode不是A6或者00的就可以判断为失败。
               'payTimeout' => date('YmdHis', strtotime('+15 minutes'))                         //订单发送时间
        );
        $txnAmt = I('post.txnAmt');    //交易金额
        $orderId = I('post.orderId');  //商户订单号

        //加入商户参数
        $params['txnAmt'] = $txnAmt*100;
        $params['merId'] = C('Yunpay.merId');    //商户号
        $params['orderId'] = $orderId;
        $params['txnTime'] = date('YmdHis');

        //商品描述,可空
        $body = trim(I('post.WIDbody'));
        $ud = session('users.uid');
        $data = array(
                'uid'=>$ud,                                  //用户id
                'win_code'=>$orderId,                     //商户订单号
                'winsubject'=>I('post.WIDsubject'),          //订单名称
                'wintotal_amount'=>$txnAmt,                //付款金额
                'winbody'=>I('post.WIDbody'),             //商品描述
                'state'=>'yl',                              //支付方式
                'status'=>'0',                              //是否支付
                'ordertime'=>time()                          //交易时间
            );
        M("pay_record")->add($data); // 保存交易信息
        \com\unionpay\acp\sdk\AcpService::sign ( $params );
        $uri = \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->frontTransUrl;
        $html_form = \com\unionpay\acp\sdk\AcpService::createAutoFormHtml( $params, $uri );
        echo $html_form;

    }

    那里本身曾试过删除里面的命名空间用
new的法门去写,那样可以简单代码,然而后边异步的时候报错,客服说不或然去除命名空间,那样会导致方法名重复,所以如故宝宝的用demo

  中提供的章程。

    异步方法——–

    

  1     //银联充值异步
  2     public function xxx()
  3     {    
  4         Vendor('Yunpay.acp_service');
  5         $logger = \com\unionpay\acp\sdk\LogUtil::getLogger();
  6         $logger->LogInfo("receive back notify: " . \com\unionpay\acp\sdk\createLinkString ( $_POST, false, true ));
  7         if (isset ( $_POST ['signature'] )) {
  8                 // echo \com\unionpay\acp\sdk\AcpService::validate ( $_POST ) ? '验签成功' : '验签失败';
  9                 $respCode = I('post.respCode');
 10                 $orderId = I('post.orderId');         // 商户订单号
 11                 $total_amount = I('post.settleAmt'); //订单金额
 12                 $trade_no = I('post.queryId');         // queryId 银联唯一标识一笔交易
 13 
 14                 //判断respCode=00、A6后,对涉及资金类的交易,请再发起查询接口查询,确定交易成功后更新数据库。
 15                 if( $respCode=='00' ){
 16                      $this->unionpay($orderId,$total_amount,$trade_no);
 17                 }else{
 18                      $res = $this->confirmpay($orderId,'1');
 19                         if( $res == 'Successful' ){
 20                             $this->unionpay($orderId,$total_amount,$trade_no);
 21                      } else {
 22                             echo '交易失败';
 23                      }
 24                 }
 25 
 26         } else {
 27             echo '签名为空';
 28         }
 29 
 30 
 31     }
 32 
 33 
 34     //银联充值
 35     public function unionpay($orderId,$total_amount,$trade_no)
 36     {
 37         $per = M("pay_record")->where('win_code='.$orderId)->find(); //查找该订单
 38         if( $per['status']=='1' ){
 39             echo '已充值';
 40             return;
 41         }
 42         $Pay = M("pay");
 43         // 在Pay模型中启动事务
 44         $Pay->startTrans();            
 45         // 进行相关的业务逻辑操作
 46         $res = $Pay->where('uid='.$per['uid'])->setInc('money',$total_amount/100);
 47         //数据组合
 48         $data = array(
 49                 'alipay_number'=>$trade_no,                  //银联唯一标识
 50                 'status'=>'1',                              //交易状态
 51                 'paytime'=>time()                          //交易时间
 52             );
 53         M("pay_record")->where('win_code='.$orderId)->save($data); // 修改交易信息
 54 
 55         if (!empty($res)){
 56           // 提交事务
 57           $Pay->commit();
 58         }else{
 59           // 事务回滚
 60           $Pay->rollback();
 61         }
 62     }
 63 
 64 
 65     //确定是否充值操作
 66     public function confirmpay($orderId,$L)
 67     {
 68         header ( 'Content-type:text/html;charset=utf-8' );
 69          Vendor('Yunpay.acp_service');
 70          $params = array(
 71             //以下信息非特殊情况不需要改动
 72             'version' => \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->version,          //版本号
 73             'encoding' => 'utf-8',          //编码方式
 74             'signMethod' => \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->signMethod,          //签名方法
 75             'txnType' => '00',              //交易类型
 76             'txnSubType' => '00',          //交易子类
 77             'bizType' => '000000',          //业务类型
 78             'accessType' => '0',          //接入类型
 79             'channelType' => '07',          //渠道类型
 80         );
 81         if($L == '0'){
 82             $time = M("order_pay")->where('win_code = "'.$orderId.'"')->find()['addtime'];
 83         }else{
 84             $time = M("pay_record")->where('win_code = "'.$orderId.'"')->find()['ordertime'];
 85         }
 86         $params['merId'] = C('Yunpay.merId');       //商户号
 87         $params['orderId'] = $orderId;               //交易的订单号
 88         $params['txnTime'] = date('YmdHis',$time); //订单发送时间
 89 
 90         \com\unionpay\acp\sdk\AcpService::sign ( $params ); // 签名
 91         $url = \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->singleQueryUrl;
 92 
 93         $result_arr = \com\unionpay\acp\sdk\AcpService::post ( $params, $url);
 94         if(count($result_arr)<=0) { //没收到200应答的情况
 95             return 'No200';
 96         }
 97         if (!\com\unionpay\acp\sdk\AcpService::validate ($result_arr) ){
 98             return "应答报文验签失败";
 99         }
100         if ($result_arr["respCode"] == "00"){
101             if ($result_arr["origRespCode"] == "00"){
102                 //交易成功
103                 //TODO
104                 return "Successful";
105             } else if ($result_arr["origRespCode"] == "03"
106                     || $result_arr["origRespCode"] == "04"
107                     || $result_arr["origRespCode"] == "05"){
108                 //后续需发起交易状态查询交易确定交易状态
109                 //TODO
110                 return "交易处理中,请稍微查询";
111             } else {
112                 //其他应答码做以失败处理
113                 //TODO
114                 return "交易失败:" . $result_arr["origRespMsg"];
115             }
116         } else if ($result_arr["respCode"] == "03"
117                 || $result_arr["respCode"] == "04"
118                 || $result_arr["respCode"] == "05" ){
119             //后续需发起交易状态查询交易确定交易状态
120             //TODO
121             return "处理超时,请稍微查询";
122         } else {
123             //其他应答码做以失败处理
124             //TODO
125             return "失败:" . $result_arr["respMsg"];
126         }
127 
128     }

    那里首先个方法xxx 中的respCode等于00 就是付出成功
,如若没有索要基于你转移的订单号在次询问在结果。那里客服说这种失利不佳模拟,就不说了,然而那操作方法照旧

  提出写下,避防万一 。

    末了证实下多少个参数 queryId  银联唯一标识,要求保留,
还有银联支付是按 ‘分’ 做单位的 所以支付跳转前 
假设是1元,你得倍加100,它才足以识别为1元,要不然就是0.01元

  然后异步到您的时候,如果您是元的单位在除于100,如若是分就不用了。

    解决收工 , 祝我们早日成为大牛

  

    

 

 

    

  

  

  

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图