1.和银联签约,签约成功之后才进行技术集成,到银联官方下载手机网页支付的技术文档和demo代码;
https://open.unionpay.com/ajweb/help/file/techFile?productId=66
demo里面有个readme.txt会告诉你要修改哪些东西
2.同样,如果遇到和支付宝一样的验签失败,原因很可能就是证书有问题,还有,测试环境手机网页打开之后会老是提示证书不受信任,转生产之后就不会,建议一开始就用生成环境,怎么转可以参考https://open.unionpay.com/ajweb/help/faq/list?id=39&level=0&from=0
3.测试可以完成支付,就可以直接把代码库
移植到thinkphp的以下文件路径中
4.当然还需要把需要用到的证书copy的工程中,配置文件中需要改变一下证书的路径,都是绝对路径来的。
5.直接引入php文件就可以进行支付了。
<?php
namespace Mobile\Action;
class UnionPayAction extends BaseAction{
public function doPay(){
vendor('UnionPayMobile.common');
vendor('UnionPayMobile.SDKConfig');
vendor('UnionPayMobile.secureUtil');
vendor('UnionPayMobile.PhpLog');
$log = new \PhpLog( SDK_LOG_FILE_PATH, "PRC", SDK_LOG_LEVEL );
$log->LogInfo ( "============处理前台请求开始===============" );
//获取商户订单的信息,填写信息提交到支付宝订单
$data = M('orders')->where('order_id='.session('orderID'))->find();
$sum = $data['order_sum_all']*100;
// 初始化日志
$params = array(
'version' => '5.0.0', //版本号
'encoding' => 'utf-8', //编码方式
'certId' => getSignCertId (), //证书ID
'txnType' => '01', //交易类型
'txnSubType' => '01', //交易子类
'bizType' => '000201', //业务类型
'frontUrl' => SDK_FRONT_NOTIFY_URL, //前台通知地址
'backUrl' => SDK_BACK_NOTIFY_URL, //后台通知地址
'signMethod' => '01', //签名方法
'channelType' => '08', //渠道类型,07-PC,08-手机
'accessType' => '0', //接入类型
'merId' => '', //商户代码,请改自己的商户号
'orderId' => $data['order_num'], //商户订单号
'txnTime' => date('YmdHis'), //订单发送时间
'txnAmt' => $sum, //交易金额,单位分
'currencyCode' => '156', //交易币种
'defaultPayType' => '0001', //默认支付方式
//'orderDesc' => '订单描述', //订单描述,网关支付和wap支付暂时不起作用
'reqReserved' =>' 透传信息', //请求方保留域,透传字段,查询、通知、对账文件中均会原样出现
);
// 签名
sign ( $params );
// 前台请求地址
$front_uri = SDK_FRONT_TRANS_URL;
$log->LogInfo ( "前台请求地址为>" . $front_uri );
// 构造 自动提交的表单
$html_form = create_html ( $params, $front_uri );
$log->LogInfo ( "-------前台交易自动提交表单>--begin----" );
$log->LogInfo ( $html_form );
$log->LogInfo ( "-------前台交易自动提交表单>--end-------" );
$log->LogInfo ( "============处理前台请求 结束===========" );
echo $html_form;
}
/******************************
服务器同步通知页面方法
其实这里就是将notify_url.php文件中的代码复制过来进行处理
*******************************/
function createNote(){
vendor('UnionPayMobile.common');
vendor('UnionPayMobile.SDKConfig');
vendor('UnionPayMobile.secureUtil');
vendor('UnionPayMobile.PhpLog');
$log = new \PhpLog( SDK_LOG_FILE_PATH, "PRC", SDK_LOG_LEVEL );
if (isset ( $_POST ['signature'] )) {
if(verify ( $_POST )){
//改变订单状态,处理后台的订单逻辑
}
} else {
echo '签名为空';
}
}
/******************************
服务器异步通知页面方法
其实这里就是将notify_url.php文件中的代码复制过来进行处理
*******************************/
function sureNote(){
vendor('UnionPayMobile.common');
vendor('UnionPayMobile.SDKConfig');
vendor('UnionPayMobile.secureUtil');
vendor('UnionPayMobile.PhpLog');
$log = new \PhpLog( SDK_LOG_FILE_PATH, "PRC", SDK_LOG_LEVEL );
foreach ( $_POST as $key => $val ) {
P(isset($mpi_arr[$key]) ?$mpi_arr[$key] : $key);
P($val);
}
if (isset ( $_POST ['signature'] )) {
P(verify ( $_POST ) ? '验签成功' : '验签失败');
P($orderId = $_POST ['orderId']); //其他字段也可用类似方式获取
//改变订单状态,处理后台的订单逻辑
} else {
echo '签名为空';
}
}
}
?>
写了一个集成的demo,改修改的东西,在README.md中有简单介绍。