使用当面付官方DEMO(PHP)调试沙箱

来自    当面付 | 
作者:我是个导演  |  更新于:2016-09-23 14:49:45     
一,说明:本帖将利用官方提供的demo进行修改成沙箱的环境demo,小伙伴如果测试沙箱报错可以自己下载这个里面的demo进行配置自己的沙箱APPID和公私钥测试即可。截图示例以php版的为例,其他开发语言的配置方法一样。

二,测试准备工作
1.登录沙箱地址:https://openhome.alipay.com/platform/appDaily.htm?tab=info 需要使用(如下图)说明



2.demo中需要配置(如下图)




3.下载沙箱demo运行测试即可。


三,demo下载地址:
1.当面付demo
  php版:F2FPay_Demo_php.zip
  官方demo版本(2017-11-10更新,内含沙箱账号,可以直接测试):dangmianfu_demo_php.zip




沙箱列表demo会在后续中更新,敬请期待,如果对demo有疑问或者demo有问题欢迎在帖子下面提问或拍砖
BEN | 2016-10-16 19:46:15
终于成功了一次,感谢
希望能出下教程介绍下php如何配置手机网站支付,我测试了下,总是报错,alipay.conf.php中的几个参数不是很确定,PID就是沙箱里的UID吗,还有沙箱网关和APPID需要吗,该填在哪里?
我是个导演 | 2016-10-17 09:22:28
BEN:终于成功了一次,感谢
希望能出下教程介绍下php如何配置手机网站支付,我测试了下,总是报错,alipay.conf.php中的几个参数不是很确定,PID就是沙箱里的UID吗,还有沙箱网关和APPID需要吗,该填在哪里?
回到原帖
手机网站有两个:一个是手机网站1.0(alipay.wap.create.direct.pay.by.user)和手机网站2.0接口(alipay.trade.wap.pay)
1.手机网站1.0(alipay.wap.create.direct.pay.by.user)接口需要使用的是pid+私钥 不支持沙箱环境
2.手机网站2.0接口(alipay.trade.wap.pay) 需要使用的是appid+私钥   支持沙箱环境 手机网站的沙箱网关和appid和当面付接口的配配置方法一样
WW | 2016-11-27 16:12:48
出现支付失败
我是个导演 | 2016-11-28 08:58:22
鹰翔于野 | 2016-12-21 21:39:40
为毛里面没有异步通知文件  PHP服务端版里面也没有
还有授权回调地址指向服务端哪个文件获取支付宝发来的CODE 然后是传递给那个文件换取令牌?
我是个导演 | 2016-12-22 09:17:37
鹰翔于野:为毛里面没有异步通知文件  PHP服务端版里面也没有
还有授权回调地址指向服务端哪个文件获取支付宝发来的CODE 然后是传递给那个文件换取令牌?
回到原帖
1.异步通知文件 我问题,当面付只有扫码支付是有异步通知的,传异步地址的方法如下(php为例)。接收验签和其他接口相同

2.第二个问题看我的这个贴子:https://openclub.alipay.com/read.php?tid=458&fid=5&page=1#1172
鹰翔于野 | 2017-01-01 20:37:50
我是个导演:1.异步通知文件 我问题,当面付只有扫码支付是有异步通知的,传异步地址的方法如下(php为例)。接收验签和其他接口相同

2.第二个问题看我的这个贴子:https://openclub.alipay.com/read.php?tid=4...
回到原帖
这个异步通知文件要怎么写 收银台二维码支付成功后收不到回调的信息。
我是个导演 | 2017-01-03 10:16:28
鹰翔于野:这个异步通知文件要怎么写 收银台二维码支付成功后收不到回调的信息。回到原帖
收不到异步通知,你提供你的交易号我看看
鹰翔于野 | 2017-01-03 11:12:14
<?php
/* *
 * 功能:支付宝服务器异步通知页面
 * 版本:3.3
 * 日期:2012-07-23
 * 说明:
 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 * 该代码仅供学习和研究支付宝接口使用,只是提供一个参考。


 *************************页面功能说明*************************
 * 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。
 * 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。
 * 该页面调试工具请使用写文本函数logResult,该函数已被默认关闭,见alipay_notify_class.php中的函数verifyNotify
 * 如果没有收到该页面返回的 success 信息,支付宝会在24小时内按一定的时间策略重发通知
 */

require_once("alipay.config.php");
require_once("lib/alipay_notify.class.php");

//计算得出通知验证结果
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();

if($verify_result) {//验证成功
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//请在这里加上商户的业务逻辑程序代


//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
    //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表

//解析notify_data
//注意:该功能PHP5环境及以上支持,需开通curl、SSL等PHP配置环境。建议本地调试时使用PHP开发软件
$doc = new DOMDocument();
if ($alipay_config['sign_type'] == 'MD5') {
$doc->loadXML($_POST['notify_data']);
}

if ($alipay_config['sign_type'] == '0001') {
$doc->loadXML($alipayNotify->decrypt($_POST['notify_data']));
}

if( ! empty($doc->getElementsByTagName( "notify" )->item(0)->nodeValue) ) {
//商户订单号
$out_trade_no = $doc->getElementsByTagName( "out_trade_no" )->item(0)->nodeValue;
//支付宝交易号
$trade_no = $doc->getElementsByTagName( "trade_no" )->item(0)->nodeValue;
//交易状态
$trade_status = $doc->getElementsByTagName( "trade_status" )->item(0)->nodeValue;

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

//注意:
//该种交易状态只在两种情况下出现
//1、开通了普通即时到账,买家付款成功后。
//2、开通了高级即时到账,从该笔交易成功时间算起,过了签约时的可退款时限(如:三个月以内可退款、一年以内可退款等)后。

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

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

//注意:
//该种交易状态只在一种情况下出现——开通了高级即时到账,买家付款成功后。

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

echo "success"; //请不要修改或删除
}
}

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

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else {
    //验证失败
    echo "fail";

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

文件是这样的。。notifyUrl 也填了但是二维码支付成功后手机上显示支付成功 PC上收不到返回来支付成功的消息
我是个导演 | 2017-01-03 11:13:02
鹰翔于野:<?php
/* *
 * 功能:支付宝服务器异步通知页面
 * 版本:3.3
 * 日期:2012-07-23
 * 说明:
 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用...
回到原帖
交易号发我。我查查
鹰翔于野 | 2017-01-03 15:44:18
我是个导演:交易号发我。我查查回到原帖
沙箱环境
商户订单号:200011
订单号:2017010321001004430200330993
appid:2016072800112626
uid:2088102168903037
我是个导演 | 2017-01-04 09:27:34
鹰翔于野:沙箱环境
商户订单号:200011
订单号:2017010321001004430200330993
appid:2016072800112626
uid:2088102168903037
回到原帖
没有查到日志。正式环境的测试可以收到吗,把您的notify_url的地址提供一下,我看看,并且把您传异步的方法截图看一下
鹰翔于野 | 2017-01-04 13:26:25
执行日期:20170104131831
responseTxt=true
 notify_url_log:isSign=false,buyer_id=2088702756533152&total_amount=0.01&trade_no=2017010421001004150220538328&body=购买商品2件共15.00元&notify_time=2017-01-04 13:18:31&open_id=20881025446162214462200721511115&subject=订单&sign_type=RSA&buyer_logon_id=133****8635&auth_app_id=2015042800051183&charset=UTF-8&notify_type=trade_status_sync&out_trade_no=200013&trade_status=WAIT_BUYER_PAY&version=1.0&sign=Yj5We9Myapx2dpQa/1a5iowbV82vfRM9yAprzlC1A6BdKJz5WvGUhNprr4DOsHKBrVSnroc7hvbu89SypGr4VGAnPtkt27FjNia7Pf+pouchaTsUPqWmnuy8Qp4kgSUXkkAKGy7VsKjr2q7hdh8IyKb38WWdILgocAUn+moh9kg=&gmt_create=2017-01-04 13:18:30&app_id=2016120603934539&seller_id=2088911510032114&notify_id=4e168b7cea8b3d5e197d7b1a08bdeceh5q
执行日期:20170104131845
responseTxt=true
 notify_url_log:isSign=false,body=购买商品2件共15.00元&open_id=20881025446162214462200721511115&subject=订单&sign_type=RSA&buyer_logon_id=133****8635&auth_app_id=2015042800051183&notify_type=trade_status_sync&out_trade_no=200013&point_amount=0.00&version=1.0&fund_bill_list=[{"amount":"0.01","fundChannel":"ALIPAYACCOUNT"}]&total_amount=0.01&buyer_id=2088702756533152&trade_no=2017010421001004150220538328&notify_time=2017-01-04 13:18:45&charset=UTF-8&invoice_amount=0.01&trade_status=TRADE_SUCCESS&gmt_payment=2017-01-04 13:18:45&sign=Tkh5Km35IIslHhKIg9jKPtAurgNvOGv11+u74R7KRNUoPYJeGk9LURHu6azdk9n2yMY5QbyQh3vgUmR5qt5mO6rwki8SrOfmyoYPexEMC9oNhWUjG1biaDO6T6rkX9+BHBlE/+OmGKY0Bxov+j8mz6iZgropUQ2OFn3Zx0iaUNQ=&gmt_create=2017-01-04 13:18:30&buyer_pay_amount=0.01&receipt_amount=0.01&seller_id=2088911510032114&app_id=2016120603934539&notify_id=f063564ed3923de8bca972193d17931h5q

上面的是打开log notify_url记录的日志 删除了&seller_email=
线上环境 notify_url的地址公网可访问显示:fail

商户订单:200013
支付宝订单:2017010421001004150220538328
鹰翔于野 | 2017-01-04 13:49:19

就是Demo 里面这样传异步,异步地址:http://pay.gxwlgc.com/admin/pay/wappay/notify_url.php

//当面付2.0预下单(生成二维码,带轮询)
public function qrPay($req) {

$bizContent = $req->getBizContent();
$this->writeLog($bizContent);

$request = new AlipayTradePrecreateRequest();
$request->setBizContent ( $bizContent );
$request->setNotifyUrl ( $this->notify_url );

// 首先调用支付api
$response = $this->aopclientRequestExecute ( $request, NULL ,$req->getAppAuthToken() );
$response = $response->alipay_trade_precreate_response;

$result = new AlipayF2FPrecreateResult($response);
if(!empty($response)&&("10000"==$response->code)){
$result->setTradeStatus("SUCCESS");
} elseif($this->tradeError($response)){
$result->setTradeStatus("UNKNOWN");
} else {
$result->setTradeStatus("FAILED");
}

return $result;

}


public function query($queryContentBuilder) {
$biz_content = $queryContentBuilder->getBizContent();
$this->writeLog($biz_content);
$request = new AlipayTradeQueryRequest();
$request->setBizContent ( $biz_content );
$response = $this->aopclientRequestExecute ( $request , NULL, $queryContentBuilder->getAppAuthToken() );


return $response->alipay_trade_query_response;
}

// 轮询查询订单支付结果
protected function loopQueryResult($queryContentBuilder){
$queryResult = NULL;
for ($i=1;$i<$this->MaxQueryRetry;$i++){
try{
sleep($this->QueryDuration);
}catch (Exception $e){
print $e->getMessage();
exit();
}

$queryResponse = $this->query($queryContentBuilder);
if(!empty($queryResponse)){
if($this->stopQuery($queryResponse)){
return $queryResponse;
}
$queryResult = $queryResponse;
}
}
return $queryResult;
}

// 判断是否停止查询
protected function stopQuery($response){
if("10000"==$response->code){
if("TRADE_FINISHED"==$response->trade_status||
"TRADE_SUCCESS"==$response->trade_status||
"TRADE_CLOSED"==$response->trade_status){
return true;
}
}
return false;
}

// 根据查询结果queryResponse判断交易是否支付成功,如果支付成功则更新result并返回,如果不成功则调用撤销
private function checkQueryAndCancel($outTradeNo, $appAuthToken, $result, $queryResponse){
if($this->querySuccess($queryResponse)){
// 如果查询返回支付成功,则返回相应结果
$result->setTradeStatus("SUCCESS");
$result->setResponse($queryResponse);
return $result;
}elseif($this->queryClose($queryResponse)){
// 如果查询返回交易关闭,标记交易失败
$result->setTradeStatus("FAILED");
return $result;
}

// 如果查询结果不为成功,则调用撤销
$cancelContentBuilder = new AlipayTradeCancelContentBuilder();
$cancelContentBuilder->setAppAuthToken($appAuthToken);
$cancelContentBuilder->setOutTradeNo($outTradeNo);
$cancelResponse = $this->cancel($cancelContentBuilder);
if($this->tradeError($cancelResponse)){
// 如果第一次同步撤销返回异常,则标记支付交易为未知状态
$result->setTradeStatus("UNKNOWN");
}else{
// 标记支付为失败,如果撤销未能成功,产生的单边帐由人工处理
$result->setTradeStatus("FAILED");
}
return $result;
}

// 查询返回“支付成功”
protected function querySuccess($queryResponse){
return !empty($queryResponse)&&
$queryResponse->code == "10000"&&
($queryResponse->trade_status == "TRADE_SUCCESS"||
$queryResponse->trade_status == "TRADE_FINISHED");
}

// 查询返回“交易关闭”
protected function queryClose($queryResponse){
return !empty($queryResponse)&&
$queryResponse->code == "10000"&&
$queryResponse->trade_status == "TRADE_CLOSED";
}

// 交易异常,或发生系统错误
protected function tradeError($response){
return empty($response)||
$response->code == "20000";
}


public function cancel($cancelContentBuilder) {
$biz_content= $cancelContentBuilder->getBizContent();
$this->writeLog($biz_content);
$request = new AlipayTradeCancelRequest();
$request->setBizContent ( $biz_content );
$response = $this->aopclientRequestExecute ( $request ,NULL ,$cancelContentBuilder->getAppAuthToken() );
return $response->alipay_trade_cancel_response;
}
我的回复
回复数
  36
阅读数
  26408

返回顶部