技术型问题,支付宝支付成功以后,如何对返回的数据进行安全验证?

alipay的支付通知有两类。异步通知(notify_url)与return_url.前面是post异步通知,后面的return_url 是get返回url只返回一次。

A服务器通知,对应的参数为notify_url,支付宝通知使用POST方式 

B页面跳转通知,对应的参数为return_url,支付宝通知使用GET方式 (通知地址不需要像以前一样去账户内设置,而是由客户在支付的时候通过参数传递给我地址)。 

类似 notify_url=http://www.cnwenhui.cn/notify_alipay.php 注意:www.cnwenhui.cn是您网站的域名,也可以用ip地址代替。对于服务器通知,ip地址一定是公网的,私有地址获取不到alipay的返回数据

一、 文件结构

1 由两部分组成,支付接口与支付成功返回接口部分。支付宝快捷支付接口一般为url直接发起网页支付。返回就是支付宝服务器对该笔订单处理完毕后,通知与返回该笔订单的详细信息到你填写的notify_url地址,服务器接收到后,对返回数据处理对应订单状态。 

2 以PHP代码中的程序为例。 

接入部分的页面文件包含:配置页alipay_Config.php、方法详细页alipay/Alipay_Payto.php、程序入口页index.php以及MD5加密方法类页alipayto/Alipay_md5.php。通知返回部分的页面文件包含:方法详细页alipay/Alipay_Payto.php、MD5加密方法类页alipayto /Alipay_md5.php、支付完成后(支付宝处理完毕后)自动跳转回的自定义页面return_Alipay_Notify.php、两方服务器间相互交互(无法直接看到)通知页Alipay_Notify.php。  

----------------------------------------------------------------- 

工作原理 

对结构有所了解之后,就可以开始研究具体是如何运行的了 

a) 接入部分原理 

i. 第一步——配置文件参数信息: 

public function config()
{
    $alipay_config = array();

    $alipay_config['partner'] = '2088***********';

//收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号
   $alipay_config['seller_id'] = '2088***********';

// MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
    $alipay_config['key'] = '12345679810111213141516';

// 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
   $alipay_config['notify_url'] = "http://www.cnwenhui.cn/notify_url";

// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
   $alipay_config['return_url'] = "http://www.cnwenhui.cn/return_url";

//签名方式
    $alipay_config['sign_type'] = strtoupper('MD5');

//字符编码格式 目前支持 gbk 或 utf-8
    $alipay_config['input_charset'] = strtolower('utf-8');

//ca证书路径地址,用于curl中ssl校验
//请保证cacert.pem文件在当前文件夹目录中
   $alipay_config['cacert'] = getcwd() . '\\cacert.pem';

//访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
    $alipay_config['transport'] = 'http';

// 支付类型 ,无需修改
    $alipay_config['payment_type'] = "1";

// 产品类型,无需修改
    $alipay_config['service'] = "create_direct_pay_by_user";

//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑


//↓↓↓↓↓↓↓↓↓↓ 请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

// 防钓鱼时间戳  若要使用请调用类文件submit中的query_timestamp函数
    $alipay_config['anti_phishing_key'] = "";

// 客户端的IP地址 非局域网的外网IP地址,如:221.0.0.1
    $alipay_config['exter_invoke_ip'] = "";

//↑↑↑↑↑↑↑↑↑↑请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
    return $alipay_config;
}

配置完成之后,直接调用封装好的执行代码: 

a) 以php程序代码为例: 

        $out_trade_no = $_POST['WIDout_trade_no'];

        //订单名称,必填
        $subject = $_POST['WIDsubject'];

        //付款金额,必填
        $total_fee = '0.01';

        //商品描述,可空
        $body = $_POST['WIDbody'];

/************************************************************/

//构造要请求的参数数组,无需改动
$parameter = array(
      "service"       => $alipay_config['service'],
      "partner"       => $alipay_config['partner'],
      "seller_id"  => $alipay_config['seller_id'],
      "payment_type" => $alipay_config['payment_type'],
      "notify_url"   => $alipay_config['notify_url'],
      "return_url"   => $alipay_config['return_url'],
      
      "anti_phishing_key"=>$alipay_config['anti_phishing_key'],
      "exter_invoke_ip"=>$alipay_config['exter_invoke_ip'],
      "out_trade_no" => $out_trade_no,
      "subject"  => $subject,
      "total_fee"    => $total_fee,
      "body" => $body,
      "_input_charset"   => trim(strtolower($alipay_config['input_charset']))
      
);

//建立请求
$alipaySubmit = new AlipaySubmit($alipay_config);
$html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
echo $html_text;

封装的demo中已经将对应的方法封装成了PHP函数,demo中直接调用就可以发起alipay支付请求。

a) 不可缺少的参数 

i. service服务参数,这个是用来区别这个接口是用的什么接口,所以绝对不能修改。 

ii. partner合作身份者ID、key安全校验码或称私钥这一组参数是签约合同生效后才能拿的到,partner是来鉴别是哪个商家与支付宝签约,而这个Key它如同钥匙般相当重要。

iii. seller_email收款人支付宝账号,支付宝中有手机类型、电子邮件类型的支付宝账号是都可以用这个参数的。 

iv. subject在支付宝的收银台里是直接与商品名称关联在一起的,但是说的更准确些的话,这个参数是这笔交易的名称,因为这笔交易不一定只买一件商品。它的作用不仅是在收银台里可以清晰的显示出来,而且在支付宝的账

-------------------------------------------------------- 

通知返回 

a) 返回页 

传递给支付宝时的return_url参数所对应的页面文件。

具备的属性: 

1、发起支后,买家已经成功付款以后流,页面会自动跳转回配置文件中填写的 return_url 地址中。 

2、支付完成后跳转 

3、参数以get方式传输。 

4、网址只跳转一次,不能重复跳转。 

b) 通知页 

传递给支付宝时的notify_url参数所对应的页面文件 

具备的属性: 

1、被支付宝调用才能启动。 

2、服务器间的传递,看不见执行操作。 

3、参数以post方式传输。 

4、支付宝中的该笔交易存在,且该笔交易状态发生了变更,就会被调用。

5、被调用程序判断(if(sign = mysign and responseTxt = true)),若我们自己在该判断中有做程序编写,成功则不再被调用,不成功则会反复被调用。

6、异步的,第一次收到订单信息(以下都称之为“通知”)是与返回页近乎等同或等同的同步时间,在判断不成功的情况下,会收到第二次第三次等次数的通知,时间间隔从最先的一两分钟,到后面的几个小时。失效时间是4

8小时。 

7、程序必须在服务器上调试、运行。 

8、程序编写时必须采用程序执行成功,才写页面echo(“success”);,不成功则写页面echo(“fail”); 支付宝根据success来判定是否要重新再次发送通知该页面的Html页面中必须是空白、无任何Html标签、无任何空格、不允许做页面跳转。

返回列表

相关文章

相关案例