当前位置: 澳门新濠3559 > 编程 > 正文

澳门新濠3559:文档主要描述微信公众号支付开发

时间:2019-12-08 22:39来源:编程
引入支付宝接口 放入一个插件库中,方便管理 时间: 2016年8月11日 一般使用支付宝支付的原理 : 创建支付类 1.发起支付 public function init() { $order_id = $_REQUEST['order_id']; $order_info = $this-ord

引入支付宝接口

澳门新濠3559 1

放入一个插件库中,方便管理

时间: 2016年8月11日

一般使用支付宝支付的原理 :

创建支付类

1.发起支付

public function init() {
    $order_id   = $_REQUEST['order_id'];
    $order_info = $this->order_db->get_one(array('id'=>$order_id));
    $product_info = $this->product_db->get_one(array('id'=>$order_info['product_id']));

    // 发起支付宝支付
    require_once("./phpcms/plugin/alipay/alipay.config.php");
    require_once("./phpcms/plugin/alipay/lib/alipay_submit.class.php");
    /**************************请求参数**************************/
    //商户订单号,商户网站订单系统中唯一订单号,必填
    $out_trade_no = $order_info['orderno']; // 订单orderno

    //订单名称,必填
    $subject = '预订'.$product_info['name'].'订单';        // 订单名称

    //付款金额,必填
    $total_fee = $order_info['payprice'];   // 订单金额

    //商品描述,可空
    $body = $product_info['name']; // 可空
    /************************************************************/

    //构造要请求的参数数组,无需改动
    $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']))
        //其他业务参数根据在线开发文档,添加参数.文档地址:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.kiX33I&treeId=62&articleId=103740&docType=1
        //如"参数名"=>"参数值" 
    );

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

2.处理支付后的动作,比如更改订单状态为支付,跳转到支付成功页面等等

a.处理同步通知

// 同步通知处理
public function return_url() {
    $this->ilog_db->addLog('return_url');
    require_once("./phpcms/plugin/alipay/alipay.config.php");
    require_once("./phpcms/plugin/alipay/lib/alipay_notify.class.php");
    //计算得出通知验证结果
    $alipayNotify = new AlipayNotify($alipay_config);
    $verify_result = $alipayNotify->verifyReturn();
    if($verify_result) {//验证成功
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //请在这里加上商户的业务逻辑程序代码

        //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
        //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
        //商户订单号
        $out_trade_no = $_GET['out_trade_no'];

        //支付宝交易号

        $trade_no = $_GET['trade_no'];

        //交易状态
        $trade_status = $_GET['trade_status'];


        if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
            //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //如果有做过处理,不执行商户的业务程序
        }
        else {
          echo "trade_status=".$_GET['trade_status'];
        }

        //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
        $this->_afterPay($out_trade_no);
    }
    else {
        //验证失败
        //如要调试,请看alipay_notify.php页面的verifyReturn函数
        echo "验证失败";
    }

}

b.处理异步通知

// 异步通知处理
public function notify_url() {
    $this->ilog_db->addLog('notify_url');
    require_once("./phpcms/plugin/alipay/alipay.config.php");
    require_once("./phpcms/plugin/alipay/lib/alipay_notify.class.php");
    //计算得出通知验证结果
    $alipayNotify = new AlipayNotify($alipay_config);
    $verify_result = $alipayNotify->verifyNotify();
    if($verify_result) {//验证成功
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        //请在这里加上商户的业务逻辑程序代


        //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——

        //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表

        //商户订单号
        $out_trade_no = $_POST['out_trade_no'];

        //支付宝交易号

        $trade_no = $_POST['trade_no'];

        //交易状态
        $trade_status = $_POST['trade_status'];


        if($_POST['trade_status'] == 'TRADE_FINISHED') {
            //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                //如果有做过处理,不执行商户的业务程序

            //注意:
            //退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知

            //调试用,写文本函数记录程序运行情况是否正常
            //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
        }
        else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
            //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                //如果有做过处理,不执行商户的业务程序

            //注意:
            //付款完成后,支付宝系统发送该交易状态通知

            //调试用,写文本函数记录程序运行情况是否正常
            //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
        }

        //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
        $this->_afterPay($out_trade_no);
    }
    else {
        //验证失败
        echo "fail";
        //调试用,写文本函数记录程序运行情况是否正常
        //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
    }
}

c.处理成功后的订单数据处理与成功提示

private function _afterPay($orderno) {
    // 获取订单信息
    $order_info  = $this->order_db->get_one(array('orderno'=>$orderno));

    if ($order_info['pay_status'] != '1') {
        $data['pay_status'] = '1';
        $data['pay_type']   = 'alipay';
        $data['pay_code']   = '';
        $data['paytime']    = time();
        $data['order_status']= 3; // 已支付
        $r = $this->order_db->update($data,array('orderno'=>$orderno));
        if ($r !== FALSE) 
        {
            // 处理支付信息
            header("Location:?m=home&c=order&a=payDone&orderno=".$orderno); 
        } else {
            showmessage('系统异常','blank');
        }
    } else {
        // 处理支付信息
        header("Location:?m=home&c=order&a=payDone&orderno=".$orderno); 
    }

}

说明: 文档主要描述微信公众号支付开发过程中处理流程和一些遇到的问题。

澳门新濠3559 2

支付配置

<?php
/* *
 * 配置文件
 * 版本:3.4
 * 修改日期:2016-03-08
 * 说明:
 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。

 * 安全校验码查看时,输入支付密码后,页面呈灰色的现象,怎么办?
 * 解决方法:
 * 1、检查浏览器配置,不让浏览器做弹框屏蔽设置
 * 2、更换浏览器或电脑,重新登录查询。
 */

//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
//合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm
// $alipay_config['partner']        = '2088811285662645';
$alipay_config['partner']       = '2088221883850827'; // jim

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

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

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

// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
$alipay_config['return_url'] = "http://local.duanzu.com/?m=ipay&c=alipay&a=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'] = "";

//![](http://images2015.cnblogs.com/blog/422101/201609/422101-20160906162103863-1845970975.png)

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

?>

1 准备工作

澳门新濠3559 3

步骤

  • 微信公众号申请,类型选择服务号或企业号,订阅号不支持微信支付功能
  • 微信商户帐号申请(需要审核)
  • 选择对应版本的 SDK 文件准备开发

摘自支付宝

遇到的问题

支付成功后,通知提示验证失败,后来发现是因为  地址中含有多余参数会导致签名失败。

找到这个方法,把多余的参数过滤掉就ok了。

/**
 * 除去数组中的空值和签名参数
 * @param $para 签名参数组
 * return 去掉空值与签名参数后的新签名参数组
 */
function paraFilter($para) {
    $para_filter = array();
    while (list ($key, $val) = each ($para)) {
        if($key == "sign" || $key == "sign_type" || $val == "" || $key == "m" || $key == "c" || $key == "a")continue; // 过滤无关参数
        else    $para_filter[$key] = $para[$key]; 
    }
    return $para_filter;
}

澳门新濠3559 4

澳门新濠3559 5

澳门新濠3559 6

澳门新濠3559 7

澳门新濠3559 8

2 支付原理

澳门新濠3559 9

业务流程

现支付宝的通知基本上有两类。

3 通知(同步、异步)

  • 3.1 同步通知

商户根据微信支付后返回的结果来处理自己的业务。

  • 3.2 异步通知

微信支付完成后,会通过在下单时候设置的 notify_url 通知商户支付结果,商户通过返回的结果来处理内部订单然后给微信返回处理结果,如果返回成功则说明商户校验信息正常通知微信不需要再次通知,否则微信会在一定时间内重复发通知给商户。通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒。

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

4 开发流程

官方文档: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

4.1 统一下单 unifiedorder

  • 4.1.1 方法中需要参数都填写,注意参数名大小写和长度

  • 4.1.2 统一下单时签名问题

  • 4.1.3 微信用户 openid 获取

  • 4.1.4 加强下单时参数验证

    public static function unifiedOrder($wxpay_config = array(), $ssl_config = array(), $proxy_config = array())
    {
        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

        //检测必填参数
        if (!array_key_exists('out_trade_no', $wxpay_config)) {
            throw new WxPayException("缺少统一支付接口必填参数 out_trade_no!");
        }
        if (!array_key_exists('body', $wxpay_config)) {
            throw new WxPayException("缺少统一支付接口必填参数 body!");
        }
        if (!array_key_exists('total_fee', $wxpay_config)) {
            throw new WxPayException("缺少统一支付接口必填参数 total_fee!");
        }
        if (!array_key_exists('trade_type', $wxpay_config)) {
            throw new WxPayException("缺少统一支付接口必填参数 trade_type!");
        }

        //关联参数
        if ('JSAPI' == $wxpay_config['trade_type']) {
            if (!array_key_exists('openid', $wxpay_config)) {
                throw new WxPayException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!");
            }
        }
        if ('NATIVE' == $wxpay_config['trade_type']) {
            if (!array_key_exists('product_id', $wxpay_config)) {
                throw new WxPayException("统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!");
            }
        }
        if (!array_key_exists('notify_url', $wxpay_config)) {
            throw new WxPayException("缺少统一支付接口必填参数!notify_url");
        }

        $xml = WxPayCore::toXml($wxpay_config);

        $startTimeStamp = WxPayCore::getMillisecond();//请求开始时间
        $response = WxPayCore::postXmlCurl($xml, $url, $proxy_config['curl_proxy_host'], $proxy_config['curl_proxy_port'], $ssl_config['sslcert_path'], $ssl_config['sslkey_path'], true);

        // 响应结果
        $responseArr = WxPayCore::fromXml($response);

        return $responseArr;
    }

4.2 微信支付JSAPI

  • 4.2.1 统一下单成功后返回数据

  • 4.2.2 签名验证

    public function getJSApiParameters($UnifiedOrderResult, $key)
    {
        if (!array_key_exists("appid", $UnifiedOrderResult)
            || !array_key_exists("prepay_id", $UnifiedOrderResult)
            || $UnifiedOrderResult['prepay_id'] == "") {
            throw new WxPayException("参数错误");
        }

        $timemap = time();

        // 生成随机数
        $o_ranchar = new CoreUtilityRandChar();
        $s_ranchar = $o_ranchar->randChar('mix', 32);

        // 生成签名
        $sign_config = array(
            "appId"     => $UnifiedOrderResult['appid'],
            "timeStamp" => "$timemap",
            "nonceStr"  => $s_ranchar,
            "package"   => "prepay_id=" . $UnifiedOrderResult['prepay_id'],
            "signType"  => "MD5",
        );
        $o_sign = new CoreUtilityWxPayWxPaySign($sign_config);
        $s_sign = $o_sign->makeSign($key);

        $params = array(
            "appId"     => $UnifiedOrderResult['appid'],
            "timeStamp" => "$timemap",
            "nonceStr"  => $s_ranchar,
            "package"   => "prepay_id=" . $UnifiedOrderResult['prepay_id'],
            "signType"  => "MD5",
            "paySign"   => $s_sign
        );

        return $params;
    }

4.3 微信公众号内置支付功能

function onBridgeReady(){
   WeixinJSBridge.invoke(
       'getBrandWCPayRequest', {
           "appId" : "wx2421b1c4370ec43b",                        //公众号名称,由商户传入
           "timeStamp":" 1395712654",                             //时间戳,自1970年以来的秒数
           "nonceStr" : "e61463f8efa94090b1f366cccfbbb444",       //随机串
           "package" : "prepay_id=u802345jgfjsdfgsdg888",
           "signType" : "MD5",                                    //微信签名方式:
           "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名
       },
       function(res){
           if(res.err_msg == "get_brand_wcpay_request:ok" ) {}
             // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。
       }
   );
}
if (typeof WeixinJSBridge == "undefined"){
   if( document.addEventListener ){
       document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
   }else if (document.attachEvent){
       document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
       document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
   }
}else{
   onBridgeReady();
}

将 微信支付 JSAPI 生成的数据作为微信内置函数 WeixinJSBridge.invoke() 发起 getBrandWCPayRequest 请求时的参数,如果参数正确当点击支付时候可以在微信公众号中调用微信客户端支付功能。

4.4 同步通知流程处理
商户根据微信内置函数调用支付结果来处理业务,例如:当支付返回 get_brand_wcpay_request:ok 说明支付成功,get_brand_wcpay_request:failget_brand_wcpay_request:cancle 说明支付失败,但是 返回数据不一定可靠

4.5 异步通知处理
微信会通过统一下单时设置的 notify_url 向商户发送支付结果通知,商户应该根据返回的数据对订单信息和商户信息等重要信息验证
避免订单错误导致资金错误,然后更新内部订单状态,最后将处理后的结果返回给微信,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)

<xml>
  <return_code><![CDATA[SUCCESS]]></return_code>
  <return_msg><![CDATA[OK]]></return_msg>
</xml>
------------------------------------------------------------
<xml>
  <return_code><![CDATA[FAIL]]></return_code>
  <return_msg><![CDATA[商户返回失败的原因]]></return_msg>
</xml>

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

5 常见问题

  • 5.1 统一下单时签名问题

  • 5.2 支付时签名验证失败

  • 5.3 异步通知未响应

Q&A: 签名错误

签名问题大部分是因为生成签名时参数不一致,例如:在统一下单时候需要传递签名参数和其他参数,个人感觉微信在调用生成预支付订单时候内部也产生签名并且
和传递过来的签名进行对比验证,当不一致时就会提示签名错误,原因就是在下单时商户主动生成的签名参数和微信内部生成参数不一致,当签名不一致时建议将方
法所需的参数作为生成签名的参数,然后再将生成签名传递。

Q&A: 异步通知未响应

1. 统一下单时 notify_url 是否设置
2. notify_url 是否符合规范:1.不能带有参数,例如:https://pay.weixin.qq.com/notify.php?wx=20160811  2.能够访问
3. 检查接口是否有访问权限设置
4. 通过 error_log 检查是否有日志文件产生

四、 通知返回

6 总结

    在微信公众号支付开发过程中,遇到很多问题有些官方文档没怎么描述清楚,导致后面花较长时间去测试原因。然后是理解到同步和异步通知的区别并且学习到 
error_log 日志功能的好处,通过生成的日志文件方便去解决问题和优化,远远超过自己预测情况时没有数据来对比分析。

a) 返回页

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

具备的属性:

1、支付接口中买家的购买流程已经走到支付宝里且支付宝提示支付成功时,页面会自动跳转回自身网站的这个页面里来。

2、同步的,无时差

3、获得参数的方法是用get方式获取。

4、不论跳转回来程序判断是真还是假(if(sign = mysign and responseTxt = true))只跳转回来一次,不重复。

5、这个并不是支付宝服务器调用了该页面,而是通过与组合拼接各参数形成的URL链接原理等同,拼接出来的URL链接,之后程序上做自动跳转。

6、基于5的原因,该页面的程序调试可不必在服务器上而是本机上调试、运行。

b) 通知页

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

具备的属性:

1、这个通知页就是被支付宝调用才能启动的。

2、服务器间的互动,不像返回页肉眼可以看到,这个是看不到的。

3、获得参数的方法是用POST方式获取。

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

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

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

8小时。

7、基于6的原因,该页面的程序调试必须在服务器上调试、运行。

8、程序编写时必须采用程序执行成功,才写页面response.Write(“success”);,不成功则写页面response.Write(“fail”); 支付宝根据success来判定是否要重新再次发送通知。

9、该页面的Html页面中必须是空白、无任何Html标签、无任何空格、不允许做页面跳转。

异步返回结果

第一步: 在通知返回参数列表中,除去sign、sign_type两个参数外,凡是通知返回回来的参数皆是待验签的参数。

第二步: 将剩下参数进行url_decode, 然后进行字典排序,组成字符串,得到待签名字符串,

第三步: 将签名参数(sign)使用base64解码为字节码串。

第四步: 使用RSA的验签方法,通过签名字符串、签名参数(经过base64解码)及支付宝公钥验证签名。

第五步:在步骤四验证签名正确后,必须再严格按照如下描述校验通知数据的正确性。

常见问题:

1.根据代码实例和开发文档熟悉接口,将代码实例的相关参数信息填写完整(可以虚拟参数),在本地测试(不上传到服务器)支付宝接口。如果没有任何问题再将接口根据实际业务做到网站或者网站后台。

2.测试时您们需要两个支付宝账户,其中一个必须实名认证并且保证有一定的金额,以便测试时使用。另外一个帐户可以作为收款方(卖家)(针对于支付接口)

3.如果做支付宝订单信息和您们后台数据同步请集成时做数据返回处理,本地测试可以使用同步测试,如果在服务器上测试,可以通过异步来做也可以(支付宝有两种数据返回处理:同步返回和异步返回)。

同步返回(return_url)和异步返回(notify_url)的区别【return_url和notify_url参数必须是两个返回处理文件的绝对路径】?

答:同步返回处理(return_url):是一种可视化的返回,ie页面跳转通知,只要支付成功,支付宝通过get方式跳转到这个地址,并且带有参数给这个页面。客户获取信息受到买家操作的影响。如果买家支付完

成后客户服务器响应比较慢,买家在显示支付宝提示的“即时到账支付成功“时关闭页面,那么客户网站是获取不到信息,我们这边称为” 掉单“。而且这个返回处理是一次性调取,即支付成功后才调取同步返回处理。

异步返回处理(notify_url):它的数据交互是通过服务器间进行数据交互,必须将其放置在服务器上(公网)测试,服务器post消息到异步返回处理页面,需要客户技术在异步返回处理页面处理相关的数据处理

,然后每一步操作都要返回给支付宝success(不能包含其他的HTML脚本语言,不可以做页面跳转。)这个返回处理如果集成OK,那么基本不会出现掉单,因为支付宝会在24小时之内分6~10次将订单信息返回

个给客户网站,直到支付宝捕获success。

备注:同步返回处理则会受到买家操作的影响:

假如买家在操作的时候,支付宝完毕进入支付宝提示成功页面,这个时候由于服务器相应比较慢,那么买家有可能会关闭这个页面,这个时候您们就会接受不到支付宝返回的信息,还有有些网银支付后也不会调取支付宝的同步返

回处理页面,这样您在同步做数据处理同样接受不到数据。

备注:

请注意:现在您们集成的时候先按照提供给您们的测试账户的ID来做,至于正式账户的ID您们可以找等合同正式生效后再查询(获取方法:登陆签约的

支付宝账户-?点击“商家服务”,就可以看到)

--处理支付宝返回通知失败几种情况:

1、SIGN与MYSIGN不等,responseTxt为invalid命令参数不对,该错误 是由于合作伙伴ID(parnterID)与安全校验码(key)未填,或填错导致

2、SIGN与MYSIGN相等,responseTxt为false,是由于服务器、端口等因素导致,这时请检查

a.防火墙是否屏蔽支付宝的IP(支付宝锁使用的IP地址是:121.0.26.11,范围:121.026.0~255)

b.端口80或者443端口开放没有或者被其他服务占用

c.以上如果都没有问题,可能会是网络验证超时导致(支付宝验证时间是1分钟,SIGN与MYSIGN不等会导致超时),需要等待网络稳定再确定问题

3、SIGN与MYSIGN不等,responseTxt为true,此时只有两种情况会出现:

其一:传递参数时格式不符合(例如:带自定义参数)导致签名不一致

其二:编码格式出现问题,这时候请检查服务器编码和网站编码是否一致,可以写编码过滤解决也可以在返回页面强制编码转换

编辑:编程 本文来源:澳门新濠3559:文档主要描述微信公众号支付开发

关键词: