TP3.2合并支付宝手机网页网站支付(最简单、直接用、报错:订单参数异常,请重新下单后再发起付款(ALIN42273))

1、支付宝开发平台商户认证

 

2、创建应用:https://docs.open.alipay.com/203/107084/

          创建应用的时候,有个问题,就是关于这个回调地址、应用网关,翻了文档也没看到具体的参数说明。

          网上有人说:

        单纯的支付接口是不需要配置这两个信息的,简单来说就是:应用网关是用于接收口碑或是生活号的信息的,授权回调地址是第三方授权或是用户信息授权使用的,如果用不到是可以不配置的!

参考地址:https://blog.csdn.net/sinat_32575213/article/details/79713654

 

3、支付宝文档中说先下载SDK,其实可以直接跳过,直接下载DEMO,直接改来用,下面就放完整个的流程代码

 

先看下DEMO的结构:

TP3.2合并支付宝手机网页网站支付(最简单、直接用、报错:订单参数异常,请重新下单后再发起付款(ALIN42273))_第1张图片

 

合并到TP的结构

TP3.2合并支付宝手机网页网站支付(最简单、直接用、报错:订单参数异常,请重新下单后再发起付款(ALIN42273))_第2张图片

 

右边是原文件,圈起来的三个文件可以删除掉(也可以不删),直接放到TP的config.php和具体的控制器里面。

 

1、TP项目的config.php配置文件

'ALIPAY_CONFIG'=>array(
        //应用ID,您的APPID。
        'app_id' => "自己创建应用的appid",//正式
//        'app_id' => "自己沙盒的appid",//沙盒

        //商户私钥,您的原始格式RSA私钥
        'merchant_private_key' => "填自己的私钥",

        //异步通知地址
        'notify_url' => '',//在方法里填,也可以在这里填

        //同步跳转
        'return_url' => '',//在方法里填,也可以在这里填

        //编码格式
        'charset' => "UTF-8",

        //签名方式
        'sign_type'=>"RSA2",

        //支付宝网关
        'gatewayUrl' => "https://openapi.alipay.com/gateway.do",//正式
//        'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",//沙盒

        //支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
        'alipay_public_key' => "填自己的",
    ),

2、前台:HTML点支付按钮页(根据逻辑调整)一定要同步POST

3、后台:请求控制器里的方法(alipayPost支付请求方法,alipayNotifyUrl异步通知方法--直接复制DEMO的,alipayReturnUrl同步反回方法--直接复制DEMO

/**
* 支付宝支付请求
*/
public function alipayPost(){
    // 支付宝生成订单
    Vendor('AlipayPHPWebPay.wappay.service.AlipayTradeService');
    Vendor('AlipayPHPWebPay.wappay.buildermodel.AlipayTradeWapPayContentBuilder');
    $config = C('ALIPAY_CONFIG');//支付宝配置信息
    $config['return_url']=$this->url.CONTROLLER_NAME.'/';//同步跳转
    $config['notify_url']=$this->url.CONTROLLER_NAME.'/alipayNotifyUrl';//异步通知地址
    $requestData=$_POST;
    if (!empty($requestData['WIDout_trade_no']) && trim($requestData['WIDout_trade_no']) != "") {
        //超时时间
        $timeout_express = "1m";

        $payRequestBuilder = new \AlipayTradeWapPayContentBuilder();
        $payRequestBuilder->setBody($requestData['WIDbody']);
        $payRequestBuilder->setSubject($requestData['WIDsubject']);
        $payRequestBuilder->setOutTradeNo($requestData['WIDout_trade_no']);
        $payRequestBuilder->setTotalAmount($requestData['WIDtotal_amount']);
        $payRequestBuilder->setTimeExpress($timeout_express);

        $payResponse = new \AlipayTradeService($config);
        $result = $payResponse->wapPay($payRequestBuilder, $config['return_url'], $config['notify_url']);
    }
}

/**
* 功能:支付宝服务器异步通知页面
* 版本:2.0
* 修改日期:2016-11-01
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。

*************************页面功能说明*************************
* 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。
* 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。
* 如果没有收到该页面返回的 success 信息,支付宝会在24小时内按一定的时间策略重发通知
*/
public function alipayNotifyUrl(){
    $res=$_POST;//支付成功的信息
    $subOrderInfo = M('记录表')->where(array('字段' => $res['out_trade_no']))->find();
    if ($subOrderInfo['status'] >= 1) {
        exit;
    }
    if(!empty($subOrderInfo)){
        $saveData = array(
            'request_trade_no' => $res['trade_no'],//支付宝订单
            'pay_time'         => time(),
            'status'           => 1,
        );
        M('记录表')->where(array('字段' => $res['out_trade_no']))->save($saveData);

        //这里写自己系统的逻辑处理,然后返回
        $this->selfAjaxReturn(true,'提交成功!',array(),U('模块/控制器/方法'));
    }else{
        exit();
    }
}

/**
* 功能:支付宝页面跳转同步通知页面
* 版本:2.0
* 修改日期:2016-11-01
* 说明:
* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。

*************************页面功能说明*************************
* 该页面可在本机电脑测试
* 可放入HTML等美化页面的代码、商户业务逻辑程序代码
*/
public function alipayReturnUrl(){
    $res=$_GET;//支付成功的信息
    $subOrderInfo = M('记录表')->where(array('字段' => $res['out_trade_no']))->find();

    if(!empty($subOrderInfo) && $subOrderInfo['status']<1){
        $saveData = array(
            'request_trade_no' => $res['trade_no'],//支付宝订单
            'pay_time'         => time(),
            'status'           => 1,
        );
        M('记录表')->where(array('字段' => $res['out_trade_no']))->save($saveData);

        //这里写自己系统的逻辑处理,然后返回
        $this->assign('输出字段',$subOrderInfo['字段']);
    }
    $this->display();

}

前端支付返回HTML(layer.js是引用了layui的框架的):主要思路是在同步的HTML中,做异步再请求后台,这样就可以弹窗,也可以直接自己定下个模态框显示


XXXXX

    
        
    
        
    


    
    

 

4、修改DEMO的相应文件和一些注意事项,不然会报错,

Vendor\AlipayPHPWebPay\wappay\service\AlipayTradeService.php文件

TP3.2合并支付宝手机网页网站支付(最简单、直接用、报错:订单参数异常,请重新下单后再发起付款(ALIN42273))_第3张图片

 

Vendor\AlipayPHPWebPay\lotusphp_runtime\shortcut.php文件C方法跟TP的重复了)

TP3.2合并支付宝手机网页网站支付(最简单、直接用、报错:订单参数异常,请重新下单后再发起付款(ALIN42273))_第4张图片

 

DEMO有个坑,参数不正确,支付宝官网文档上写的请求参数是 product_code (https://docs.open.alipay.com/203/107090/

Vendor\AlipayPHPWebPay\wappay\buildermodel\AlipayTradeWapPayContentBuilder.php文件

TP3.2合并支付宝手机网页网站支付(最简单、直接用、报错:订单参数异常,请重新下单后再发起付款(ALIN42273))_第5张图片

 

还有要注意金额的格式,这个也是容易错的


以上是在沙盒环境测过没有问题,由于应用要审核,如果有别的BUG,大家自行搜索就好,先解决大问题

你可能感兴趣的:(TP3.2合并支付宝手机网页网站支付(最简单、直接用、报错:订单参数异常,请重新下单后再发起付款(ALIN42273)))