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 '簽名爲空';
}
}
}
?>