php PayPal 支付/回调

paypal开发者账号申请地址

https://developer.paypal.com/

创建开发者账号后有一个买家账号 一个卖家账号 就可以测试paypal支付了

paypal支付页面

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Paypal订单支付</title>
</head>
<body>
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="POST"  name="form_starPay"> <!-- // Live https://www.paypal.com/cgi-bin/webscr -->
    <input type='hidden' name='cmd' value='_xclick'>  <!-- //告诉paypal该表单是立即购买 -->
    <input type='hidden' name='business' value='[email protected]'> <!-- //卖家帐号 也就是收钱的帐号 -->
    <input type='hidden' name='item_name' value='支付订单:20180828080706000039'> <!-- //商品名称 item_number -->
    <input type='hidden' name='item_number' value='20180828080706000039'> <!-- //物品号 item_number -->
    <input type='hidden' name='amount' value='0.01'> <!-- .// 订单金额 -->
    <input type='hidden' name='currency_code' value='HKD'> <!-- .// 货币 -->
    <input type='hidden' name='return' value='http://test.cq.com/'> <!-- .// 支付成功后网页跳转地址 -->
    <input type='hidden' name='notify_url' value='https://www.test.net/api/order/notify'> <!-- .//支付成功后paypal后台发送订单通知地址 -->
    <input type='hidden' name='cancel_return' value='http://test.cq.com/'> <!-- .//用户取消交易返回地址 -->
    <input type='hidden' name='invoice' value='20180828080706000039'> <!-- .//自定义订单号 -->
    <input type='hidden' name='charset' value='utf-8'> <!-- .// 字符集 -->
    <input type='hidden' name='no_shipping' value='1'> <!-- .// 不要求客户提供收货地址 -->
    <input type='hidden' name='no_note' value='1'> <!-- .// 付款说明 -->
    <input type='hidden' name='rm' value='2'> <!-- 不知道是什么 -->
    <input type="image" name="submit"   src="https://www.paypal.com/en_US/i/btn/btn_buynow_LG.gif" />
</form>
正在跳转Paypal支付,请稍等。。。
<script>
    function sub(){
        document.form_starPay.submit();
    }
    onload(sub())
</script>
</body>
</html>

支付回调,并进行ipn验证 将回调字段添加上$data['cmd'] = '_notify-validate';返回进行验证

  /**
     * 支付回调函数
     * @author gyj <[email protected]>
     * @createtime 2018-08-24T11:38:23+0800
     * @return     
     */
    public function notify(){
        if(!$this->request->isPost()) die();

        //记录支付回调信息
        if(!empty($_POST)){
                $notify_str = "支付回调信息:\r\n";
            foreach ($_POST as $key => $value) {
                $notify_str.=$key."=".$value.";\r\n";
            }
        }
        log_result($notify_str,"paypal");

        //ipn验证
        $data = $_POST;
        $data['cmd'] = '_notify-validate';
        $url = config('paypal.gateway');//支付异步验证地址
        $res = https_request($url,$data);
        //记录支付ipn验证回调信息
        log_result($res,'paypal');
        
        if (!empty($res)) {
            if (strcmp($res, "VERIFIED") == 0) {

                if ($_POST['payment_status'] == 'Completed' || $_POST['payment_status'] == 'Pending') {
                    //付款完成,这里修改订单状态
                    $order_res = $this->order_pay($_POST);
                    if(!$order_res){
                        log_result('update order result fail','paypal');
                    }
                    return 'success';
                }
            } elseif (strcmp($res, "INVALID") == 0) {
                //未通过认证,有可能是编码错误或非法的 POST 信息
                return 'fail';
            }
        } else {
            //未通过认证,有可能是编码错误或非法的 POST 信息

            return 'fail';

        }
        return 'fail';
    }

附上log_result函数 和https_result函数

log_result函数:

/**
* 记录自定义日志
* @author gyj  <[email protected]>
* @createtime 2018-08-24 14:12:01
* @param $msg 错误信息
* @param $type 写入类型 wechat aliyun
* @return [type] [description]
*/
if(!function_exists('log_result')){
  function log_result($msg='',$type='normal')
  {
    $dir = dirname(LOG_PATH)."/log/".$type."/";
    if(!is_dir($dir)){
        mkdir($dir,0777);
    }
    $dir .= date('Ym')."/";
    $file = $dir.date('d').".log";
    if(!is_dir($dir)){
        mkdir($dir,0777);
    }
    file_put_contents($file,date('Y-m-d H:i:s')."\r\n".$msg."\r\n---------------------------------------------------------------\r\n", FILE_APPEND);
  }
  
}

https_result函数:

/**
 * 发送post请求
 * @author ganyuanjiang  <[email protected]>
 * @createtime 2017-07-26 14:06:04
 * @param string $url 请求地址
 * @param array $post_data post键值对数据
 * @return string
 */
if (!function_exists('https_request')) {
    
  function https_request($url,$data=null){
    header("Content-type: text/html; charset=utf-8");
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $tmpInfo = curl_exec($ch);
    if (curl_errno($ch)) {
      return curl_error($ch);
    }

    curl_close($ch);
    return $tmpInfo;

  }
}

附上paypal支付记录表:

/*
Navicat MySQL Data Transfer

Source Server         : localhost
Source Server Version : 50553
Source Host           : localhost:3306
Source Database       : museum

Target Server Type    : MYSQL
Target Server Version : 50553
File Encoding         : 65001

Date: 2018-08-30 17:44:49
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for yu_paypal
-- ----------------------------
DROP TABLE IF EXISTS `yu_paypal`;
CREATE TABLE `yu_paypal` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增编号',
  `cmd` char(20) NOT NULL DEFAULT '' COMMENT '购物车系统',
  `amount` decimal(11,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '订单支付金额',
  `currency_code` char(10) NOT NULL DEFAULT '' COMMENT '货币类型',
  `return` varchar(255) NOT NULL DEFAULT '' COMMENT '支付成功跳转页面',
  `no_shipping` char(5) CHARACTER SET utf8mb4 NOT NULL DEFAULT '',
  `no_note` char(5) NOT NULL DEFAULT '',
  `cancel_return` varchar(255) NOT NULL DEFAULT '' COMMENT '订单取消支付跳转链接',
  `notify_url` varchar(255) NOT NULL DEFAULT '' COMMENT '支付回调',
  `rm` char(5) NOT NULL DEFAULT '',
  `transaction_subject` varchar(255) NOT NULL DEFAULT '' COMMENT '交易主体',
  `txn_type` char(50) NOT NULL DEFAULT '' COMMENT '类型',
  `payment_date` char(50) NOT NULL DEFAULT '' COMMENT '支付时间',
  `first_name` char(50) NOT NULL DEFAULT '' COMMENT '',
  `last_name` char(50) NOT NULL DEFAULT '' COMMENT '',
  `residence_country` char(20) NOT NULL DEFAULT '' COMMENT '居住国家',
  `pending_reason` varchar(255) NOT NULL DEFAULT '' COMMENT '支付原因',
  `item_name` varchar(255) NOT NULL DEFAULT '' COMMENT '支付商品名称',
  `payment_gross` decimal(11,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '支付总额',
  `mc_currency` char(20) NOT NULL DEFAULT '' COMMENT '返回货币类型',
  `business` char(100) NOT NULL DEFAULT '' COMMENT 'paypal商家账号',
  `payment_type` char(20) NOT NULL DEFAULT '' COMMENT '支付类型',
  `protection_eligibility` char(100) NOT NULL DEFAULT '' COMMENT '保护资质',
  `verify_sign` varchar(255) NOT NULL DEFAULT '' COMMENT '验证字符串',
  `payer_status` char(50) NOT NULL DEFAULT '' COMMENT '付款人状态',
  `test_ipn` char(20) NOT NULL DEFAULT '' COMMENT '测试穿透网络',
  `payer_email` varchar(255) NOT NULL DEFAULT '' COMMENT '支付者账号',
  `txn_id` char(50) NOT NULL DEFAULT '' COMMENT 'txn编号',
  `quantity` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '数量',
  `receiver_email` char(100) NOT NULL DEFAULT '' COMMENT '收款账号',
  `invoice` char(20) NOT NULL DEFAULT '' COMMENT '订单号',
  `payer_id` char(50) NOT NULL DEFAULT '' COMMENT '付款人编号',
  `receiver_id` char(50) NOT NULL DEFAULT '' COMMENT '收款人编号',
  `item_number` char(50) NOT NULL DEFAULT '' COMMENT '物品号',
  `payment_status` char(100) NOT NULL DEFAULT '' COMMENT '支付状态',
  `mc_gross` decimal(11,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '订单金额',
  `custom` varchar(255) NOT NULL DEFAULT '' COMMENT '客户',
  `charset` char(10) NOT NULL DEFAULT '' COMMENT '编码',
  `notify_version` char(5) NOT NULL DEFAULT '' COMMENT '支付回调版本',
  `ipn_track_id` char(20) NOT NULL DEFAULT '' COMMENT 'ipn追踪编号',
  `payment_fee` char(50) NOT NULL DEFAULT '' COMMENT '支付金额',
  `mc_fee` decimal(11,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '交易金额',
  `create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
  `update_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='paypal支付表';

猜你喜欢

转载自www.cnblogs.com/jiafeimao-dabai/p/9561763.html