paypal简单分享

经过一段时间跟paypal的死磕,现在算是能够实现最简单的支付流程,这期间很感谢paypal的客服跟技术支持,尤其是技术支持,很热情的帮我检查问题,我就想通过这个让跟我遇到相同问题的朋友们能够尽快绕过去,别在这里因为一些简单的问题浪费时间!

    主要卡在登录支付的时候一直登录不成功,setbuyer 500错;
    
    一、首先是账号的注册,在官网www.paypal.com注册一个自己的卖家账号。申请成功之后,他会给你两个测试账号,一个卖家账号,一个买家账号,但是这个地方很坑,因为经过什么国家外汇监管规定,导致两个咱们国家的账号之间不能交易,这个也是paypal的工作人员告诉我的;


    paypal简单分享_第1张图片


      所以根据上面的要求我们就需要两个不同的国籍的账号,所以自己重新创建两个测试号;
      **在创建两个测试号的时候,需要注意的是当其中一个账号是中国的时候在credit cards的时候最好选择none别选visa其他的我没试过**
      之所以这样,是因为visa是国际信用卡(别人跟我解释的我也不懂)

    paypal简单分享_第2张图片

 

账号创建完成之后,需要去给卖家账号做一些配置,首先是设置 回调 “即时付款通知”,

paypal简单分享_第3张图片

它就是一个方法,当支付状态发生变化的时候,paypal就会回调这个方法,也就是说它里面你可以写自己支付的一些逻辑,我的就是当发现成功的时候修改订单状态而已;

 

二、账号创建的问题解决了,接下来就是简单的表单demo

//测试www.sandbox.paypal.com,正式www.paypal.com //卖家邮箱 //商品名称 //商品价格 //交易货币 //支付成功后返回到什么地方 //IPN回调地址

当点击按钮之后
      paypal简单分享_第4张图片

paypal简单分享_第5张图片

当支付成功的时候,就会需要到那个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以上;

 

 

你可能感兴趣的:(paypal简单分享)