支付宝回调,得到这样一个数组(数组只是形式,并不是真实数据)
array (
  'discount' => '0.00',
  'payment_type' => '1',
  'subject' => '测试02',
  'trade_no' => '201603122100106821',
  'buyer_email' => '18776152065',
  'gmt_create' => '2016-03-12 11:30:08',
  'notify_type' => 'trade_status_sync',
  'quantity' => '1',
  'out_trade_no' => '1603125610283',
  'seller_id' => '2088122451677261',
  'notify_time' => '2016-03-13 11:54:40',
  'body' => '测试02',
  'trade_status' => 'TRADE_SUCCESS',
  'is_total_fee_adjust' => 'N',
  'total_fee' => '0.01',
  'gmt_payment' => '2016-03-12 11:30:09',
  'seller_email' => '[email protected]',
  'price' => '0.01',
  'buyer_id' => '2088612804',
  'notify_id' => 'ba20b13f6lk2',
  'use_coupon' => 'N',
  'sign_type' => 'RSA',
  'sign' => 'Bn6IEyE9=',
)然后ksort()排序,去除sign_type,sign,拼接成body=Hello&buyer_email=13788888888&buyer_id=2088002007013600..............这样字符串openssl_verify(`拼接字符串`, base64_decode($_POST['sign']), $publickey);总返回 0 ,验证不成功,是哪一步出错

解决方案 »

  1.   

    是调用支付宝API吗
      

  2.   

    支付宝异步回调的时候,直接用支付宝提供的SDK,在配置文件里
    //合作身份者id,以2088开头的16位纯数字
    $alipay_config['partner'] = '';
    //收款支付宝账号
    $alipay_config['seller_email'] = ’‘;
    //安全检验码,以数字和字母组成的32位字符
    $alipay_config['key'] = '';
    //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
    //签名方式 不需修改
    $alipay_config['sign_type'] = strtoupper('MD5');
    //字符编码格式 目前支持 gbk 或 utf-8
    $alipay_config['input_charset'] = strtolower('utf-8');
    //ca证书路径地址,用于curl中ssl校验
    //请保证cacert.pem文件在当前文件夹目录中
    $alipay_config['cacert'] = ‘/rsa_private_key.pem';
    //访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
    $alipay_config['transport'] = 'http';配置好这些参数,直接调用$aliPayNotify->verifyNotify()就行了。确定你异步回调的地址是外网,支付宝能访问到的。。
      

  3.   

    支付宝回调的SDK,你配置了相关参数然后引用了相关类就可以了啊。<?php
    require "/path/to/sdk/php";//引入逻辑函数
    $alipayNotify = new AlipayNotify($alipay_config);
    $verify_result = $alipayNotify->verifyNotify();
    if($verify_result)
    {
    if(!empty($_POST['out_trade_no']))
    {
    $trade_status=$_POST['trade_status'];
    if ($trade_status == 'TRADE_SUCCESS')
    {
                            $result = function()   // 你的业务逻辑,当操作成功的时候返回true
    if ($result)
    {
    echo "success"; //请不要修改或删除
    }
    else
    {
    echo 'fail';
    }
    }
    elseif($trade_status == 'TRADE_FINISHED')
    {
    echo "success"; //请不要修改或删除
    }
    }
    }
      

  4.   

    是不是 sign 里面的加号变成空格了?因为支付宝的 sign 有做 base64 编码,然后做了 url 编码,所以会把加号变成空格,这样就验证失败了