加入收藏 | 设为首页 | 会员中心 | 我要投稿 莆田站长网 (https://www.0594zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP后端银联支付及退款实例代码

发布时间:2021-01-25 03:16:29 所属栏目:PHP教程 来源:网络整理
导读:副标题#e# 声明:此文以当前银联官方最新SDK(2016-08-09 5.1.0版)进行说明,若出现包不相同的情况请检查是否是此版本 近期遇到银联支付以及相关退款(此文仅以手机控件支付作为前提)操作,下面会依次写出期间遇到的问题以及基本流程,在此之前通过官方的一张

先说异步通知处理,此步骤为订单状态修改的主要依据。无实际难点,保证相关参数无问题即可

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"] . "."); }

}

依据返回状态值进行相关操作即可,实际逻辑代码请自行实现

切换生产环境

项目关系暂无法进行-后续补充

未完待续。。。。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

(编辑:莆田站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读