ThinkPHP使用Paypal支付接口的模块开发

</p> <!--?php <br ?--> /** * * PaypalAction.class.php * * ThinkPHP Paypal支付接口模块 * **/ class PaymentAction extends Action { /** * 自己的paypal账号 */ private account = ‘[email protected]’; /** * paypal支付网关地址 */ privategateway = ‘https://www.paypal.com/cgi-bin/webscr?’; public function index() { echo ‘Payment this order.‘; } /** * 生成订单并跳转到Paypal进行支付 */ public function order() { /** * 自己的逻辑代码 * 判断是否登录、购买的哪个商品、购物车等等逻辑 * 当然可以调用Model更简单点 * 这里不在赘述 */ /** …… **/ order_info = array(); // 初始化订单数据order_id = uniqid(); // 按照自己的规则生成订单号入库 /** * 订单包含哪几种商品、谁买的、什么时间、几件 */ order_info[‘order_id’] =order_id; order_info[‘member_id’] = Session::get(‘member_id’); /** …. **/order = D(‘Order’); if( order->createOrder(order_info) ) { unset(order,order_info); // 初始化准备提交到Paypal的数据 pp_info = array(); // 告诉Paypal,我的网站是用的我自己的购物车系统pp_info[‘cmd’] = ‘_xclick’; // 告诉paypal,我的(商城的商户)Paypal账号,就是这钱是付给谁的 pp_info[‘business’] =this->account; // 用户将会在Paypal的支付页面看到购买的是什么东西,只做显示,没有什么特殊用途, // 如果是多件商品,则直接告诉用户,只支付某个订单就可以了 pp_info[‘item_name’] = “支付订单:{order_id}”; pp_info[‘amount’] = ’13’; // 告诉Paypal,我要收多少钱 // 告诉Paypal,我要用什么货币。这里需要注意的是,由于汇率问题, // 如果网站提供了更改货币的功能,那么上面的amount也要做适当更改, // paypal是不会智能的根据汇率更改总额的pp_info[‘currency_code’] = ‘USD’; // 当用户成功付款后paypal会将用户自动引导到此页面。 // 如果为空或不传递该参数,则不会跳转 pp_info[‘return’] = ‘http#//www.sjolzy.cn/index.php/payment/finish’;pp_info[‘invoice’] = order_id;pp_info[‘charset’] = ‘utf-8’; pp_info[‘no_shipping’] = ‘1’;pp_info[‘no_note’] = ‘1’; // 当跳转到paypal付款页面时,用户又突然不想买了。则会跳转到此页面 pp_info[‘cancel_return’] = ‘http#//www.sjolzy.com/index.php/product/view/pid/3’; // Paypal会将指定 invoice 的订单的状态定时发送到此URL // (Paypal的此操作,是paypal的服务器和我方商城的服务器点对点的通信,用户感觉不到)pp_info[‘notify_url’] = ‘http#//www.sjolzy.com/index.php/payment/notify/orderid/’.order_id;pp_info[‘rm’] = ‘2’; paypal_payment_url =this->gateway.http_build_query($pp_info); echo “Go Paypal!“; unset(pp_info); } else {this->error(L(‘order_create_fail’)); } } public function finish() { this->success(‘购买成功’); } public function notify() { // 由于这个文件只有被Paypal的服务器访问,所以无需考虑做什么页面什么的, // 这个页面不是给人看的,是给机器看的order_id = (int) _GET[‘orderid’];order_info = D(‘Order’)->getOrderDetail(order_id); // 由于该URL不仅仅只有Paypal的服务器能访问,其他任何服务器都可以向该方法发起请求。 // 所以要判断请求发起的合法性,也就是要判断请求是否是paypal官方服务器发起的 // 拼凑 post 请求数据req = ‘cmd=_notify-validate’;// 验证请求 foreach (_POST ask=>v){v = urlencode(stripslashes(v));req .= “&{k}={v}”; } ch = curl_init(); curl_setopt(ch,CURLOPT_URL,’http://www.paypal.com/cgi-bin/webscr’); 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 && !emptyempty(order_info) ) { // 本次请求是否由Paypal官方的服务器发出的请求 if(strcmp(res, ‘VERIFIED’) == 0) { /** * 判断订单的状态 * 判断订单的收款人 * 判断订单金额 * 判断货币类型 */ if((_POST[‘payment_status’] != ‘Completed’ &&_POST[‘payment_status’] != ‘Pending’) OR (_POST[‘receiver_email’] !=this->account) OR (_POST[‘mc_gross’] != 13) OR (‘USD’ !=_POST[‘mc_currency’])) { // 如果有任意一项成立,则终止执行。由于是给机器看的,所以不用考虑什么页面。直接输出即可 exit(‘fail’); } else {// 如果验证通过,则证明本次请求是合法的 D(‘Order’)->finishOrder($order_id);// 更改订单状态 exit(‘success’); } } else { exit(‘fail’); } } } } ?>

打赏
Bookmark the permalink.
0 0 投票数
文章评分
订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论