先说异步通知处理,此步骤为订单状态修改的主要依据。无实际难点,保证相关参数无问题即可
get('type') == 1){//前台通知-进行订单状态查询
$query = $this->unionPayQuery($request,array(),1);
return new JsonResponse($query);
}
require_once dirname(dirname(dirname(__FILE__))) . "/Model/unionpay-sdk/sdk/acp_service.php";
$log = LogUtil::getLogger();
$AcpService = new AcpService();
if ($request->request->has('signature') && $AcpService->validate($_POST)) {
$order_no = $request->request->get('orderId');
$respCode = $request->request->get('respCode');
$total = $request->request->get('txnAmt'); // 交易金额
if ($respCode === '00' || $respCode === 'A6') {
$trade_no = $request->request->get('origQryId')?:'UN' . date('YmdHis',time()) . substr(implode(NULL,array_map('ord',str_split(substr(uniqid(),7,13),1))),8);
$this->dispose($order_no,$trade_no,4);//订单交易处理-请根据实际情况自行编写
}
} else {
if (!$request->request->has('signature')) {
$log->LogInfo('签名为空');
} else {
$log->LogInfo('验签失败');
}
}
exit;
}
订单交易状态查询
unionPayQuery('',$orders);
$number += 1;
}while($query['errorCode'] != 0 || empty($query['result_arr']["queryId"]));
public function unionPayQuery($request,$orders)
{
require_once dirname(dirname(dirname(FILE))) . "/Model/unionpay-sdk/sdk/acp_service.php";
$config = new SDKConfig();
$AcpService = new AcpService();
$log = LogUtil::getLogger();
$params = array(
//以下信息非特殊情况不需要改动
'version' => $config->getSDKConfig()->version,//编码方式
'signMethod' => $config->getSDKConfig()->signMethod,//签名方法
'txnType' => '00',//交易类型
'txnSubType' => '00',//交易子类
'bizType' => '000000',//业务类型
'accessType' => '0',//接入类型
'channelType' => '07',//渠道类型
//TODO 以下信息需要填写
'orderId' => $orders['order_no'],//请修改被查询的交易的订单号,8-32位数字字母,不能含“-”或“_”
'merId' => $this->getParameter('mer_id'),//商户代码,请改自己的测试商户号
'txnTime' => date('YmdHis',time()),//请修改被查询的交易的订单发送时间,格式为YYYYMMDDhhmmss
);
$AcpService->sign ( $params ); // 签名
$url = $config->getSDKConfig()->singleQueryUrl;
$result_arr = $AcpService->post ( $params,$url);
if(count($result_arr)<=0) { //没收到200应答的情况 $log->LogInfo('没收到200应答的情况');
}
if (!$AcpService->validate ($result_arr) ){
$log->LogInfo('应答报文验签失败');
}
if ($result_arr["respCode"] == "00"){
if ($result_arr["origRespCode"] == "00"){
//交易成功
$trade_no = 'UN' . date('YmdHis',8);
$this->dispose($orders['order_no'],4);
$result = array('errorCode'=>0,'message'=>'交易成功','result_arr'=>$result_arr);
} else if ($result_arr["origRespCode"] == "03"
|| $result_arr["origRespCode"] == "04"
|| $result_arr["origRespCode"] == "05"){
//后续需发起交易状态查询交易确定交易状态
$result = array('errorCode'=>2,'message'=>'交易处理中','result_arr'=>$result_arr);
} else {
//其他应答码做以失败处理
echo "交易失败:" . $result_arr["origRespMsg"] . "。
n";
$result = array('errorCode'=>1,'message'=>"交易失败:" . $result_arr["origRespMsg"] . ".",'result_arr'=>$result_arr);
}
} else if ($result_arr["respCode"] == "03"
|| $result_arr["respCode"] == "04"
|| $result_arr["respCode"] == "05" ){
//后续需发起交易状态查询交易确定交易状态
$result = array('errorCode'=>2,'message'=>"处理超时,请稍后查询.",'result_arr'=>$result_arr);
} else {
//其他应答码做以失败处理
$result = array('errorCode'=>1,'message'=>"失败:" . $result_arr["respMsg"] . ".",'result_arr'=>$result_arr);
}
return $result;
}
到此为止,若是项目没有订单线上退款就完成了。
订单退款相关
set_time_limit(100);
$config = new SDKConfig();
$AcpService = new AcpService();
$log = LogUtil::getLogger();
$number = 0;
do{//循环查询,直到获取到退款订单的queryID
sleep($number * 2);
$query = $this->unionPayQuery('',$orders);
$number += 1;
}while($query['errorCode'] != 0 || empty($query['result_arr']["queryId"]));
if ($query['errorCode'] != 0) {
return array('errorCode'=>1,'message'=>'订单未成交,无法退款');
}
$params = array(
//以下信息非特殊情况不需要改动
'version' => $config->getSDKConfig()->version,//签名方法
'txnType' => '04',//渠道类型
'backUrl' => $config->getSDKConfig()->backUrl,//后台通知地址
//TODO 以下信息需要填写
'orderId' => "T" . $orders['order_no'],//商户订单号,8-32位数字字母,不能含“-”或“_”,可以自行定制规则,重新产生-此处为在退款订单前拼接 T
'merId' => $this->getParameter('mer_id'),//商户代码,请改成自己的商户号
'origQryId' => $query['result_arr']["queryId"],//原消费的queryId,可以从查询接口或者通知接口中获取
'txnTime' => date('YmdHis',//订单发送时间,格式为YYYYMMDDhhmmss,重新产生,不同于原消费
'txnAmt' => $orders['total_price'] * 100,//交易金额,退货总金额需要小于等于原消费
);
$AcpService->sign ( $params ); // 签名
$url = $config->getSDKConfig()->backTransUrl;
$result_arr = $AcpService->post ( $params,$url);
if(count($result_arr)<=0) { //没收到200应答的情况 return array('errorCode'=>1,'message'=>"没收到应答.");
}
if (!$AcpService->validate ($result_arr) ){
return array('errorCode'=>1,'message'=>"应答报文验签失败.");
}
if ($result_arr["respCode"] == "00"){
//交易已受理,等待接收后台通知更新订单状态,如果通知长时间未收到也可发起交易状态查询
return array('errorCode'=>0,'message'=>"受理成功.");
} else if ($result_arr["respCode"] == "03"
|| $result_arr["respCode"] == "04"
|| $result_arr["respCode"] == "05" ){
//后续需发起交易状态查询交易确定交易状态
return array('errorCode'=>1,'message'=>"处理超时,请稍微查询.");
} else {
//其他应答码做以失败处理
return array('errorCode'=>1,'message'=>"失败:" . $result_arr["respMsg"] . ".");
}
}
依据返回状态值进行相关操作即可,实际逻辑代码请自行实现
切换生产环境
项目关系暂无法进行-后续补充
未完待续。。。。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。 (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|