1.首先去開發者平臺注冊測試賬號,注冊網站是
2.好了之后再進入Sandbox建立測試用的Paypal虛擬帳號(至少應該建立一個Business的和一個Personal的),這個虛擬帳號可以建一個商家號和一個支付號,可用于測試,里面的金額可以自由設定。
3.商家號那里一般填寫的是郵箱(測試的時候,正式的商家號不是郵箱)。
4.需要注意的是:
5.
1、把相關配置信息盡量放到數據庫中。
6.
2、測試帳號下的支付完成后是不會觸發異步回調地址的,需要到開發者平臺的去模擬相關觸發。
7.
3、為了回調支付準確,增加了一個可以自定義的驗證密鑰,參與加密驗證。
8.基本配置信息:
function__construct(){
parent::__construct();
$testConfig=array(
'payUrl'='https://www.300.cn/cgi-bin/webscr',//支付地址
'business'='3HSV6******',//商家號
'currency_code'='USD',//支付幣種具體代碼可參考:https://developer.paypal.com/docs/classic/api/currency_codes/
'lc'='US',//支付頁面的語言具體代碼可參考:https://developer.paypal.com/docs/classic/api/country_codes/
'key'='siteape',//個人加密字符串
);
$prodConfig=array(
'payUrl'='https://www.300.cn/cgi-bin/webscr',//支付地址
'business'='3HSV6******',//商家號
'currency_code'='USD',//支付幣種具體代碼可參考:https://developer.paypal.com/docs/classic/api/currency_codes/
'lc'='US',//支付頁面的語言具體代碼可參考:https://developer.paypal.com/docs/classic/api/country_codes/
'key'='siteape',//個人加密字符串
);
$payConfig=$testConfig;//這里切換測試環境和生產環境
$this-payConfig=$payConfig;
}
9.paypal支付提交處理
publicfunctionpaypalpay(){
$oid=I('oid');
//數據信息
$order=M('order')-find($oid);//訂單信息
if(!$order){
$this-display('Public:404');
exit();
}
$data=$this-payConfig;
//訂單詳情信息
$orderDetail=M('order_detail')-where(array('oid'=$oid))-select();
$goodsInfo='';
foreach($orderDetailas$k=$v){
$product=M($v['name'])-field('title')-find($v['pid']);
$product_color=M($v['name'].'_colors')-field('title')-find($v['color_id']);
$goodsInfo.=$product['title'].'-'.$product_color['title'].'-'.$v['diameter'].'-'.$v['number'].'-';
}
//加密傳值
$signSrc='';
$signArr=array(
'invoice'=$order['order_num'],//自定義訂單號
'key'=$data['key'],//自定義的加密字符串
);
foreach($signArras$k=$v){
$signSrc.=$v;
}
$signInfo=strtoupper(hash(sha256,$signSrc));
//表單提交
$formData=array(
'cmd'='_xclick',
'business'=$data['business'],
'item_name'=string_replace($goodsInfo),
'currency_code'=$data['currency_code'],
'amount'=$order['real_money'],
'notify_url'=C('PROTOCOL').$_SERVER['SERVER_NAME'].U('Pay/paypalnotifyurl'),
'return'=C('PROTOCOL').$_SERVER['SERVER_NAME'].U('Order/info',array('order_num'=$order['order_num'],'paypal'=1)),//支付成功后網頁跳轉地址把order_num帶上
'cancel_return'=C('PROTOCOL').$_SERVER['SERVER_NAME'].U('Order/info',array('order_num'=$order['order_num'])),//用戶取消支付后跳轉的地址
'invoice'=$order['order_num'],//自定義訂單號
'no_shipping'=1,
'custom'=$signInfo,//自定義變量原樣返回訂單id號
'charset'='utf8',
'lc'=$data['lc'],
);
header(Content-type:text/html;charset=utf-8);
//輸出提交表單
$payForm='formaction='.$data['payUrl'].'method=postid=formname=form'.inputs($formData).'/formscriptdocument.form.submit()/script';
echo$payForm;
}
10.paypal回調地址
publicfunctionpaypalnotifyurl(){
$data=$this-payConfig;
//加密接收值
$getData=array(
'invoice'=I('post.invoice'),
'key'=$data['key'],
);
//鍵名和鍵值和上面的原加密字符串一致
$payment_status=I('post.payment_status');
$custom=I('post.custom');//接收的加密字符串
$signSrc='';
foreach($getDataas$k=$v){
$signSrc.=$v;
}
$signInfo=strtoupper(hash(sha256,$signSrc));
//驗證與修改
if($signInfo==$custom$payment_status=='Completed'){
//改變訂單的狀態為已支付
$saveData=array(
'pay_create_time'=time(),
'pay_sign_info'=$signInfo,
'status'=2,
);
$re=M('order')-where(array('order_num'=$getData['invoice']))-data($saveData)-save();
$payResult=Congratulations,paymentissuccessful!;
}else{
$payResult=Datavalidationfailed;
}
/*支付的異步記錄備查*/
$logData=I('post.');
$logfile=.'/payPalLog_c451f8e6e5301
4.txt';
import(Org.Util.File);
$logObj=new\File($logfile);
$logfile=$logObj-getRealFile();
file_put_contents($logfile,serialize($logData),FILE_APPEND);
}
}
11.組裝表單域
functioninputs($data){
$inputs='';
foreach($dataas$k=$v){
$inputs.='inputtype=hiddenname='.$k.'value='.$v.'/';
}
return$inputs;
}