经过一段时间跟paypal的死磕,现在算是能够实现最简单的支付流程,这期间很感谢paypal的客服跟技术支持,尤其是技术支持,很热情的帮我检查问题,我就想通过这个让跟我遇到相同问题的朋友们能够尽快绕过去,别在这里因为一些简单的问题浪费时间!
一、首先是账号的注册,在官网www.paypal.com注册一个自己的卖家账号。申请成功之后,他会给你两个测试账号,一个卖家账号,一个买家账号,但是这个地方很坑,因为经过什么国家外汇监管规定,导致两个咱们国家的账号之间不能交易,这个也是paypal的工作人员告诉我的;
所以根据上面的要求我们就需要两个不同的国籍的账号,所以自己重新创建两个测试号;
**在创建两个测试号的时候,需要注意的是当其中一个账号是中国的时候在credit cards的时候最好选择none别选visa其他的我没试过**
之所以这样,是因为visa是国际信用卡(别人跟我解释的我也不懂)
账号创建完成之后,需要去给卖家账号做一些配置,首先是设置 回调 “即时付款通知”,
它就是一个方法,当支付状态发生变化的时候,paypal就会回调这个方法,也就是说它里面你可以写自己支付的一些逻辑,我的就是当发现成功的时候修改订单状态而已;
二、账号创建的问题解决了,接下来就是简单的表单demo
<form id="form_starPay" name="form_starPay" action="https://www.paypal.com/cgi-bin/webscr" method="post"> //测试www.sandbox.paypal.com,正式www.paypal.com
<input type="hidden" name="cmd" value="_xclick">
<input type="hidden" name="business" value="[email protected]"> //卖家邮箱
<input type="hidden" name="item_name" value="name"> //商品名称
<input type="hidden" name="amount" value="1"> //商品价格
<input type="hidden" name="currency_code" value="USD"> //交易货币
<input type="hidden" name="return" value=""> //支付成功后返回到什么地方
<input type="hidden" name="notify_url" value=""> //IPN回调地址
<input style="" type="submit" src=" https://www.paypal.com/en_US/i/btn/btn_buynow_LG.gif " border="0" name="submit" alt=" PayPal - The safer, easier way to pay online">
</form>
当点击按钮之后
当支付成功的时候,就会需要到那个IPN的回调地址接下来是一些我的回调代码;
/**
* paypal的回调处理
*/
public function notify() {
$order_model = new \app\index\model\Order();
$param = $_POST;
//获取订单号
$order_number = $param['invoice'];
$where['order_number'] = $order_number;
//通过order_number找到相对应的订单,在线面判断的时候如果该信息为空就请求失败
$order_info = $order_model->getOrderInfoByWhere($where);
// 拼凑 post 请求数据
$req = 'cmd=_notify-validate'; // 验证请求
foreach ($param as $k => $v) {
$v = urlencode(stripslashes($v));
$req .= "&{$k}={$v}";
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, PAYPAL_PAY_URL);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
$res = curl_exec($ch);
curl_close($ch);
if ($res && !empty($order_info)) {
if (strcmp($res, 'VERIFIED') == 0) {
if ($param['payment_status'] == 'Reversed') {
//如果退款 就把付款状态给修改了
$update_data = array();
$update_data['status'] = 3;
$update_data['update_at'] = date('Y-m-d H:i', time());
$order_model->name('home_en_order')->where(array('order_id' => $order_info['order_id']))->update($update_data);
} else if ($param['payment_status'] == 'Completed') {// 如果验证通过,则证明本次请求是合法的
//如果付款成功,就记录用户信息同时修改付款状态
$update_data = array();
$update_data['status'] = 2;
$update_data['user_email'] = $param['payer_email'];
$update_data['currency_type'] = $param['mc_currency'];
$update_data['user_name'] = $param['last_name'] . ' ' . $param['first_name'];
$update_data['update_at'] = date('Y-m-d H:i', time());
$order_model->name('home_en_order')->where(array('order_id' => $order_info['order_id']))->update($update_data);
exit('success');
} else {
exit('fail');
}
} else {
$order_model->name('home_en_order')->where(array('order_id' => 1))->update(array('user_name' => '修改失败'));
exit('fail');
}
} else {
$order_model->name('home_en_order')->where(array('order_id' => 1))->update(array('user_name' => '返回失败'));
exit('fail');
}
}
需要注意的是,IPN验证的时候数据返回给paypal的时候必须要用https协议,不能是http,并且paypal支付最好使用的php版本在5.3以上;