在thinkphp中 结合 支付宝 paypal 财付通

<?php

class PaymentAction extends Action {

    /**
     * 自己的paypal账号
     */
    private $account = 'XXXXX@gmail.com';

    /**
     * paypal支付网关地址
     */
    private $gateway = 'https://www.paypal.com/cgi-bin/webscr?';

    public function index() {
        echo '<a href="'.U('Payment/order').'">Payment this order.</a>';
    }

    /**
     * 生成订单并跳转到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);
            $pp_info = array();// 初始化准备提交到Paypal的数据
            $pp_info['cmd'] = '_xclick';// 告诉Paypal,我的网站是用的我自己的购物车系统
            $pp_info['business'] = $this->account;// 告诉paypal,我的(商城的商户)Paypal账号,就是这钱是付给谁的
            $pp_info['item_name'] = "支付订单:{$order_id}";// 用户将会在Paypal的支付页面看到购买的是什么东西,只做显示,没有什么特殊用途,如果是多件商品,则直接告诉用户,只支付某个订单就可以了
            $pp_info['amount'] = '13'; // 告诉Paypal,我要收多少钱
            $pp_info['currency_code'] = 'USD';// 告诉Paypal,我要用什么货币。这里需要注意的是,由于汇率问题,如果网站提供了更改货币的功能,那么上面的amount也要做适当更改,paypal是不会智能的根据汇率更改总额的
            $pp_info['return'] = 'http://www.domain.com/index.php/payment/finish';// 当用户成功付款后paypal会将用户自动引导到此页面。如果为空或不传递该参数,则不会跳转
            $pp_info['invoice'] = $order_id;
            $pp_info['charset'] = 'utf-8';
            $pp_info['no_shipping'] = '1';
            $pp_info['no_note'] = '1';
            $pp_info['cancel_return'] = 'http://www.domain.com/index.php/product/view/pid/3';// 当跳转到paypal付款页面时,用户又突然不想买了。则会跳转到此页面
            $pp_info['notify_url'] = 'http://www.domain.com/index.php/payment/notify/orderid/'.$order_id;// Paypal会将指定 invoice 的订单的状态定时发送到此URL(Paypal的此操作,是paypal的服务器和我方商城的服务器点对点的通信,用户感觉不到)
            $pp_info['rm'] = '2';

            $paypal_payment_url = $this->gateway.http_build_query($pp_info);
            echo "<a href='{$paypal_payment_url}'>Go Paypal!</a>";
            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 as $k=>$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 && !empty($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');
            }
        }
    }
} 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这是一款资源商城插件, 可以给你的用户分享一些收费资源,wordpress插件,经过完美测试运行于wordpress 3.0.1-3.9.1版本。本插件特点:高级VIP会员系统,银联/支付宝担保和即时到帐/贝宝paypal支付系统,前端注册和个人资料管理、查看订单信息等,推广提成系统,收费下载系统,下载加密。后续会按具体需要增加更多实用的功能。 如果你结合WP用户前端化专业版插件可以实现本站这样的前台用户心,用户不必登陆到后台就能完成充值和购买,查看自己的消费清单,还可以过联盟来推广本站资源来获取佣金。这个插件请移步到 点击这里 购买,因为涉及二次开发,如果你需要整合这样的用户心需要另外付费,收费金额600-1000元! 基本功能: 已经整合国内支付集成支付宝(担保交易/双功能接口/即时到帐) 设置会员提现手续费比率 设置安全模式(使支付宝担保交易无法充值成功,即时到帐可充值成功) 设置支付宝异步处理订单 设置用户推广提成比率 设置货币昵称(例如:积分,金币,T币,QB) 设置充值比例(例如:1元=100积分) 查询消费记录 查询充值记录 查看与处理取现申请列表 查看全部收益与推广 推广用户消费获得提成(这对管理员没必要) 站内用户转账 后台改价功能 用户充值与扣费 查询用户余额、充值记录、消费记录 发布收费下载资源(支持外链,可设置解压密码,可以付费后直接显示也可以过邮箱推送。) 发布收费查看内容 在消费清单下载资源 管理与、投稿者、订阅者权限分配(以上某些功能是管理员专有权限) 前端短代码调用 其他功能: 下载地址加密 用户余额提现 VIP会员(包月、包季、包年、永久)特权(VIP专享、VIP半价、VIP八折、VIP免费) 如果下载文件升级了,已付费会员可以继续免费下载 优化注册页面 colorbox灯箱弹窗特效 前端个人心(可直接充值、查看消费、插件联盟收益、余额提现)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值