TP3.2.3 接入银联支付

    项目接入银联支付的过程, 在此记录下,希望能帮助开发盆友平坑。

    银联SKD链接:https://open.unionpay.com/ajweb/product/newProDetail?proId=1&cataId=14

    首先我们先下载官方提供的SDK  ,下载好了解压选择版本 ,里面有PHP  java  .net  这里我们自然是选择PHP版本的,接入前我们先配环境,它要我们PHP

  的版本 在5.3以上,并且需开启环境的curl、openssl功能。

   然后就是它提供的测试证书了,默认在window系统是放在D:/certs ,意思是在你的电脑的D创建一个名为certs 的文件夹,然后将4个证书放进去,测试的名为

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

 修改成Linux中的路径。

  如图:

  

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

  下载对应的你还需要可以需要解签名证书的密码 和商户号 , 这些后面都会提到的。

    在然后我们将名为SDK文件夹中的六个文件放到我们项目放到 ThinkPHP\Library\Vendor\Yunpay 的文件夹中

    

     写逻辑代码前你还得前配置好你的acp_sdk.ini 文件 ,文件里面都写的很清楚,这里就不一一解释了,这里是我的支付代码

    

//银联充值操作
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

  中提供的方法。

    异步方法--------

    

     //银联充值异步
public function xxx()
{
Vendor('Yunpay.acp_service');
$logger = \com\unionpay\acp\sdk\LogUtil::getLogger();
$logger->LogInfo("receive back notify: " . \com\unionpay\acp\sdk\createLinkString ( $_POST, false, true ));
if (isset ( $_POST ['signature'] )) {
// echo \com\unionpay\acp\sdk\AcpService::validate ( $_POST ) ? '验签成功' : '验签失败';
$respCode = I('post.respCode');
$orderId = I('post.orderId'); // 商户订单号
$total_amount = I('post.settleAmt'); //订单金额
$trade_no = I('post.queryId'); // queryId 银联唯一标识一笔交易 //判断respCode=00、A6后,对涉及资金类的交易,请再发起查询接口查询,确定交易成功后更新数据库。
if( $respCode=='00' ){
$this->unionpay($orderId,$total_amount,$trade_no);
}else{
$res = $this->confirmpay($orderId,'1');
if( $res == 'Successful' ){
$this->unionpay($orderId,$total_amount,$trade_no);
} else {
echo '交易失败';
}
} } else {
echo '签名为空';
} } //银联充值
public function unionpay($orderId,$total_amount,$trade_no)
{
$per = M("pay_record")->where('win_code='.$orderId)->find(); //查找该订单
if( $per['status']=='1' ){
echo '已充值';
return;
}
$Pay = M("pay");
// 在Pay模型中启动事务
$Pay->startTrans();
// 进行相关的业务逻辑操作
$res = $Pay->where('uid='.$per['uid'])->setInc('money',$total_amount/100);
//数据组合
$data = array(
'alipay_number'=>$trade_no, //银联唯一标识
'status'=>'1', //交易状态
'paytime'=>time() //交易时间
);
M("pay_record")->where('win_code='.$orderId)->save($data); // 修改交易信息 if (!empty($res)){
// 提交事务
$Pay->commit();
}else{
// 事务回滚
$Pay->rollback();
}
} //确定是否充值操作
public function confirmpay($orderId,$L)
{
header ( 'Content-type:text/html;charset=utf-8' );
Vendor('Yunpay.acp_service');
$params = array(
//以下信息非特殊情况不需要改动
'version' => \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->version, //版本号
'encoding' => 'utf-8', //编码方式
'signMethod' => \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->signMethod, //签名方法
'txnType' => '00', //交易类型
'txnSubType' => '00', //交易子类
'bizType' => '000000', //业务类型
'accessType' => '0', //接入类型
'channelType' => '07', //渠道类型
);
if($L == '0'){
$time = M("order_pay")->where('win_code = "'.$orderId.'"')->find()['addtime'];
}else{
$time = M("pay_record")->where('win_code = "'.$orderId.'"')->find()['ordertime'];
}
$params['merId'] = C('Yunpay.merId'); //商户号
$params['orderId'] = $orderId; //交易的订单号
$params['txnTime'] = date('YmdHis',$time); //订单发送时间 \com\unionpay\acp\sdk\AcpService::sign ( $params ); // 签名
$url = \com\unionpay\acp\sdk\SDKConfig::getSDKConfig()->singleQueryUrl; $result_arr = \com\unionpay\acp\sdk\AcpService::post ( $params, $url);
if(count($result_arr)<=0) { //没收到200应答的情况
return 'No200';
}
if (!\com\unionpay\acp\sdk\AcpService::validate ($result_arr) ){
return "应答报文验签失败";
}
if ($result_arr["respCode"] == "00"){
if ($result_arr["origRespCode"] == "00"){
//交易成功
//TODO
return "Successful";
} else if ($result_arr["origRespCode"] == "03"
|| $result_arr["origRespCode"] == "04"
|| $result_arr["origRespCode"] == "05"){
//后续需发起交易状态查询交易确定交易状态
//TODO
return "交易处理中,请稍微查询";
} else {
//其他应答码做以失败处理
//TODO
return "交易失败:" . $result_arr["origRespMsg"];
}
} else if ($result_arr["respCode"] == "03"
|| $result_arr["respCode"] == "04"
|| $result_arr["respCode"] == "05" ){
//后续需发起交易状态查询交易确定交易状态
//TODO
return "处理超时,请稍微查询";
} else {
//其他应答码做以失败处理
//TODO
return "失败:" . $result_arr["respMsg"];
} }

    这里第一个方法xxx 中的respCode等于00 就是支付成功 ,如果没有需要根据你生成的订单号在次查询在结果。这里客服说这种失败不好模拟,就不说了,但是这操作方法还是

  建议写下,以防万一 。

    最后说明下几个参数 queryId  银联唯一标识,需要保存, 还有银联支付是按 '分' 做单位的 所以支付跳转前  假如是1元,你得乘以100,它才可以识别为1元,要不然就是0.01元

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

    搞定收工 , 祝大家早日成为大牛

  

    

    

  

  

  

TP3.2.3 接入银联支付的更多相关文章

  1. Idea-Java接入银联支付的Demo

    注:本文来源于:< Idea-Java接入银联支付的Demo > 接入银联支付的Demo,希望能给大家节约一点时间 https://github.com/wangfei0904306/un ...

  2. .NET接入UnionPay银联支付(一)手机wap支付

    最近呢,比较忙,公司在接入银联全渠道支付,博主接手的wap支付,发表一下博主在接入的时候遇到的坑和注意事项,方便大家学习接入,爬坑的路上更顺利一点~ 开发步骤 1. 以表单的方式组装要发送给银联全渠道 ...

  3. wap站、手机APP 接入支付宝、微信、银联支付。

    一.wap站 ①.支付宝接入 1.开发前准备:申请一个通过实名认证的企业支付宝账号,并申请开通手机WAP支付功能. 2.流程 参数准备: 企业支付宝账号的PID(也叫ParnerID)和KEY,如果使 ...

  4. iOS----支付(微信支付、支付宝支付、银联支付控件集成支付)(转)

    资料 支付宝 //文档idk都包含了安卓.iOS版 银 联 银联官网资料 Demo Demo给了一个订单号,做测试使用,若出现支付失败什么的,可能是已经被别人给支付了,或者是服务器订单过期了 ~ 一. ...

  5. Phonegap 之 iOS银联在线支付(js调用ios端银联支付控件)

    Phonegap项目,做支付的时候,当把网站打包到ios或android端成app后,在app上通过wap调用银联在线存在一个问题: 就是当从银联支付成功后,再从服务器返回到app客户端就很难实现. ...

  6. 集成 Union Pay - 银联支付

    作者感言 前面已经把WeChat SDK的支付, AliPay SDK搞得七七八八了, 接下来就是银联支付的Union Pay SDK.最后:如果你有更好的建议或者对这篇文章有不满的地方, 请联系我, ...

  7. iOS第三方支付-银联支付

    #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> #import "UPPayPluginDeleg ...

  8. unity3d银联支付出现闪退

    在接入银联SDK的unity3d的游戏中,点击银联支付会出现游戏总是出现闪退现象 ,后来网上有资料说 打开银联的jar包,将里面的res/drawable目录下的文件,拷贝到您的工程的drawable ...

  9. TP3.2.3 接入支付宝

    TP3.2.3 接入支付宝 项目接入支付宝支付了,在做这个给我的感觉是,方便 ,毕竟是老马的产品是吧, 话不多说 , 首先我们先找到官方的SDK  ,不想去找的小伙伴复制此链接 https://doc ...

随机推荐

  1. CLR类型设计之参数传递

    写到这篇文章的时候,笔者回忆起来以前的开发过程中,并没有注意参数的传递是以值传递还是引用传递的,也是第一次了解到可变参数params,常用的不一定就代表理解,可能只是会用.接下来我们就一起回忆一下关于 ...

  2. python基础-------模块与包(一)

    模块与包 Python中的py文件我们拿来调用的为之模块:主要有内置模块(Python解释器自带),第三方模块(别的开发者开发的),自定义模块. 目前我们学习的是内置模块与第三方模块. 通过impor ...

  3. 私人网盘系统2.0—全部升级为layUI+PHP(持续更新中)shang

    网盘系统2.0   上周,我做了第一版的“私人网盘系统”,http://www.cnblogs.com/sunlizheng/p/7822036.html 没看过的朋友可以去看一下,这周在家升级做了第 ...

  4. 如何使用webpack优化首屏渲染时间

    其实说到性能优化,他的范围太广了,今天我们就只聊一聊通过webpack配置减少http请求数量这个点吧. 简单说下工作中遇到的问题吧,我们做的一个项目中首页用了十多张图片,每张图片都是一个静态资源,所 ...

  5. javascript函数式编程(一)

    一.引言 javascript函数式编程在最近两年来频繁的出现在大众的视野,越来越多的框架(react,angular,vue等)标榜自己使用了函数式编程的特性,好像一旦跟函数式编程沾边,就很高大上一 ...

  6. python3学习笔记(1)

    一.模块初识(接上篇)模块(库)分为两种:1.标准库:不需要安装直接可以导入的库,例:getpass.2.第三方库:必须要下载安装才可以使用.注:编辑的模块文件名不能与导入的模块名重复. 在模块文件中 ...

  7. iis7 部署网站 403错误

    C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i 403 - 禁止访问: 访问被拒绝. 您无权使用所提供的凭据查看此 ...

  8. 《RabbitMQ Tutorial》第 1 章 简介

    本文来自英文官网,其示例代码采用了 .NET C# 语言. <RabbitMQ Tutorial>第 1 章 简介(Introduction) RabbitMQ is a message ...

  9. 用sort()按小到大排序的方法:

    例子:function compare(value1,value2){ if(value1<value2){ return -1; }else if(value1==value2){ retur ...

  10. Emrips 反质数枚举 javascript实现

    今天看到一个kata,提出一个"emirps"的概念:一个质数倒转后得到的是一个不同的质数,这个数叫做"emirps". 例如:13,17是质数,31,71也是 ...