中国银联支付接口对接

对接前,需要提供的资料有:
1、商户号
2、公钥和私钥文件
3、加密处理函数库
4、结算币种等
在测试的状态下,一般有供测试的银行卡号信息,可向银联业务索取进行测试。
下面是接口对接示例处理器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
<?php
namespace Home\Controller;
use Think\Controller;
use Common\Controller\HomeController;

/**
* ChinaPay中国银联支付接口对接
* Class PaychinaController
* @package Home\Controller
*/
class PaychinaController extends HomeController {
function __construct() {
parent::__construct();
$uid=session('uid');
$this->uid=$uid;
$testConfig=array(
'payUrl'=>'http://payment-test.chinapay.com/pay/TransGet',//支付地址
'merID'=>'808080661******',//商户号
'drRoot'=>'..'.__ROOT__,//密钥地址
);
$prodConfig=array(
'payUrl'=>'https://payment.chinapay.com/pay/TransGet',//支付地址
'merID'=>'808080661******',//商户号
'drRoot'=>'.'.__ROOT__,//密钥地址
);
$payConfig=$testConfig;//这里切换测试环境和生产环境
$payConfig=array(
'payLibrary'=>$payConfig['drRoot'].'/netpayclient.php',//银联系统处理函数集
'MerPrKKey'=>$payConfig['drRoot'].'/MerPrK_808080661******_20170331104505.key',//私钥
'PgPubkkey'=>$payConfig['drRoot'].'/PgPubk.key',//公钥
'alllog'=>$payConfig['drRoot'].'/log.txt',//异步总记录日志
'paylog'=>$payConfig['drRoot'].'/paylog.txt',//异步支付记录日志
);
foreach($payConfig as $k=>$v){
$this->k=$v;
}
include_once($this->payLibrary);//引入银联验证类

}

/**
* 订单支付
*/
public function payOrder(){
$orderid=session('orderid');//获取当前订单的id
if(!$orderid){
$this->error('出现错误,订单不存在');
exit();
}else{
$orderData=M('order')->find($orderid);
if($orderData['status']==2){
$this->error('出现错误,订单已经支付了,请不要重复支付');
exit();
}
$payData=array(
'MerId'=>$this->merID,//商户号
'OrdId'=>$orderData['ordernum'],//订单id
'TransAmt'=>$orderData['order_amount'],//订单总额
'CuryId'=>'HKD',//支付币种
'CountryId'=>'0086',//支付国家区号
'TransDate'=>date('Ymd',time()),//交易时间
'TransType'=>'0001',//交易类型
'Version'=>'20080515',//接口版本号
'BgRetUrl'=>'http://www.****.com/paychina/payBackUrl.html',//异步回调地址
'PageRetUrl'=>'http://www.****.com/paychina/payCompleted.html',//支付完成跳转地址
'GateId'=>'',
'Priv1'=>$orderData['id'],//原样返回接收这里写订单的id和订单号
'TimeZone'=>'+06',
'TransTime'=>date('His',time()),
'DSTFlag'=>'1',
'ExtFlag'=>'00',
'Priv2'=>'priv2',
'ChkValue'=>''
);
$merid = buildKey($this->MerPrKKey);
if(!$merid) {
$this->error('导入私钥文件失败');
}

$plain = $payData['MerId'] . $payData['OrdId'] . $payData['TransAmt'] . $payData['CuryId'] . $payData['TransDate'] . $payData['TransTime']. $payData['TransType']. $payData['CountryId']. $payData['TimeZone']. $payData['DSTFlag']. $payData['ExtFlag'] . $payData['Priv1'];
$signature=sign($plain);;//签名串
$payData['ChkValue']=$signature;
header("Content-type: text/html; charset=utf-8");
//输出提交表单
$payForm='<form action="'.$this->payUrl.'" method="post" id="form" name="form">'.inputs($payData).'</form><script>document.form.submit()</script>';
echo $payForm;
session('orderid',null);//提交时将订单号清空
}
}

/**
* 支付回调处理
*/
public function payBackUrl(){
file_put_contents($this->alllog,serialize(I('get.')),FILE_APPEND);//写入全部接收的字符串

$flag = buildKey($this->PgPubkkey);
if(!$flag) {
//如果错误写入错误日志
file_put_contents($this->paylog,'导入公钥文件失败\r\n',FILE_APPEND);
exit();
}
//接收参数
$getData=array(
'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"],//原样返回来的私有数据写的是id号
);
$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"];
$flag = verifyTransResponse($merid, $orderno, $amount, $currencycode, $transdate, $transtype, $status, $checkvalue);
if(!$flag) {
file_put_contents($this->paylog,'验证签名失败\r\n',FILE_APPEND);
exit();
}
//验证签名成功,则根据返回码写入操作
if($status!='1001'){
//交易失败记录信息
file_put_contents($this->paylog,'交易失败\r\n',FILE_APPEND);
}else{
//交易成功根据相关信息保存数据
file_put_contents($this->paylog,date('Y-m-d H:i:s',time()).serialize($getData).'交易成功\r\n',FILE_APPEND);
M('order')->where(array('id'=>$priv1))->data(array('status'=>2))->save();
}
}
}

php 版对接使用说明:
chinapay 支付插件 (PHP 版) 使用说明

  1. 本接口需要 mcrypt 和 bcmath 两个 PHP 扩展库的支持,请先确认你安装并启用了这两个库。
    如果你是虚拟主机用户,一般主机商都会安装这两个标准库,你可以使用 phpinfo() 函数查看 PHP 配置信息,如果没有安装,请联系主机商解决。

  2. 文件说明:netpaylclient.php 为 chinapay 提供的签名验签函数库文件,具体方法请参考用户手册

  3. 你在本公司申请商户号后,将得到两个后缀名为.key 的测试密钥文件,其中以 Mer 开头的为私钥文件,以 Pg 开头的为公钥文件。
    把这两个密钥文件放到程序所在目录下(其他位置也可,但需要根据实际位置进行相应配置)
    打开配置文件,根据你的实际情况修改公私钥文件路径。
    银联支付接口文档地址:
    https://open.unionpay.com/ajweb/product