新增服务包支付回调处理

This commit is contained in:
wucongxing8150 2024-04-11 16:25:30 +08:00
parent d7338c495b
commit 8bda29a15e
8 changed files with 561 additions and 4 deletions

View File

@ -4,6 +4,7 @@ namespace App\Controller;
use App\Amqp\Producer\AssignDoctorDelayDirectProducer;
use App\Amqp\Producer\AutoCompleteInquiryDelayDirectProducer;
use App\Amqp\Producer\CancelUnInquiryOrdersDelayDirectProducer;
use App\Amqp\Producer\DetectionCompleteDelayDirectProducer;
use App\Amqp\Producer\DoctorNotYetInquiryDelayDirectProducer;
use App\Amqp\Producer\GrantUserCouponDelayDirectProducer;
@ -32,7 +33,11 @@ use App\Model\OrderProductCoupon;
use App\Model\OrderProductItem;
use App\Model\OrderProductLogistic;
use App\Model\OrderProductRefund;
use App\Model\OrderServicePackage;
use App\Model\OrderServicePackageCase;
use App\Model\PatientFamily;
use App\Model\PatientFamilyHealth;
use App\Model\PatientFamilyPersonal;
use App\Model\Product;
use App\Model\ProductPlatformAmount;
use App\Model\User;
@ -2288,4 +2293,439 @@ class CallBackController extends AbstractController
);
}
/**
* 微信服务包退款回调
* @return ResponseInterface
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
* @throws \Throwable
*/
public function wxPayServiceRefundCallBack(): ResponseInterface
{
try {
// 处理支付结果事件
$WechatPay = new WechatPay(1, 4);
$app = $WechatPay->createApp();
$server = $app->getServer();
// 获取解密消息
$message = $server->getDecryptedMessage();
if (empty($message)) {
Db::rollBack();
return $this->response->withStatus(500)->withBody(new SwooleStream(strval(json_encode(['code' => 'ERROR', 'message' => "回调数据为空"], JSON_UNESCAPED_UNICODE))));
}
Log::getInstance("CallBack-wxPayServiceRefund")->info(json_encode($message->toArray(), JSON_UNESCAPED_UNICODE));
if (empty($message['out_trade_no'])) {
Log::getInstance("CallBack-wxPayServiceRefund")->error("缺少外部订单号");
return $server->serve();
}
} catch (\Exception $e) {
// 验证失败
Log::getInstance("CallBack-wxPayServiceRefund")->error($e->getMessage());
return $this->wxPayErrorReturn($e->getMessage());
}
Db::beginTransaction();
try {
// 验证订单数据
$params = array();
$params['order_service_no'] = $message['out_trade_no'];
$order_service_package = OrderServicePackage::getOne($params);
if (empty($order_service_package)) {
Db::rollBack();
Log::getInstance("CallBack-wxPayServiceRefund")->error("非法订单");
return $server->serve();
}
// 验证订单状态
if ($order_service_package['order_service_status'] == 1) {
// 订单状态1:待支付 2:未开始 3:服务中 4:服务完成 5:服务取消)
Db::rollBack();
Log::getInstance("CallBack-wxPayServiceRefund")->error("订单状态错误:当前为" . $order_service_package['order_service_status']);
return $server->serve();
}
// 验证订单退款状态
if ($order_service_package['refund_status'] == 3) {
// 检测订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常)
Db::rollBack();
Log::getInstance("CallBack-wxPayServiceRefund")->error("订单退款状态错误:当前为" . $order_service_package['refund_status']);
return $server->serve();
}
// 验证订单支付状态
if (in_array($order_service_package['pay_status'], [1, 3, 4, 5, 6, 7])) {
// 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
Db::rollBack();
Log::getInstance("CallBack-wxPayServiceRefund")->error("订单支付状态错误:当前为" . $order_service_package['pay_status']);
return $server->serve();
}
// 处理退款回调结果
$OrderService = new OrderService();
$OrderService->orderRefundResult($order_service_package['order_service_no'],$message['refund_status'],$message['success_time']);
Db::commit();
} catch (\Exception $e) {
// 验证失败
Db::rollBack();
Log::getInstance("CallBack-wxPayServiceRefund")->error("微信支付回调数据验证失败:" . $e->getMessage());
return $this->wxPayErrorReturn($e->getMessage());
}
Log::getInstance("CallBack-wxPayServiceRefund")->info("微信退款回调处理成功");
return $server->serve();
}
/**
* 患者端服务包支付回调
* @return ResponseInterface
* @throws \Throwable
*/
public function wxPayServiceSuccessCallBack(): ResponseInterface
{
try {
// 处理支付结果事件
$WechatPay = new WechatPay(1, 4);
$app = $WechatPay->createApp();
$server = $app->getServer();
// 获取解密消息
$message = $server->getDecryptedMessage();
if (empty($message)) {
return $this->response->withStatus(500)->withBody(new SwooleStream(strval(json_encode(['code' => 'ERROR', 'message' => "问诊微信支付回调数据为空"], JSON_UNESCAPED_UNICODE))));
}
Log::getInstance("CallBack-wxPayServiceSuccess")->info(json_encode($message->toArray(), JSON_UNESCAPED_UNICODE));
if (empty($message['out_trade_no'])) {
Log::getInstance("CallBack-wxPayServiceSuccess")->error("缺少外部订单号");
return $server->serve();
}
}catch (\Throwable $e){
// 验证失败
Log::getInstance("CallBack-wxPayServiceSuccess")->error($e->getMessage());
return $this->wxPayErrorReturn($e->getMessage());
}
Db::beginTransaction();
try {
// 查询订单
$params = array();
$params['order_service_no'] = $message['out_trade_no'];
$order_service_package = OrderServicePackage::getOne($params);
if (empty($order_service_package)) {
Db::rollBack();
Log::getInstance("CallBack-wxPayServiceSuccess")->error("无订单数据");
return $server->serve();
}
// 验证订单状态
if ($order_service_package['order_service_status'] != 1) {
// 检测订单状态(1:待支付 2:待绑定 3:检测中 4:检测完成 5:已取消)
Db::rollBack();
Log::getInstance("CallBack-wxPayServiceSuccess")->error("检测微信支付回调数据处理失败,订单状态当前为" . $order_service_package['order_service_status']);
return $server->serve();
}
// 支付状态无需验证,如第一次支付失败,会修改支付状态,再次支付时,会出现验证不通过的情况
// 处理支付状态
if ($message['trade_state'] == "SUCCESS") {
// 支付成功
$pay_status = 2;
$pay_time = date('Y-m-d H:i:s', strtotime($message['success_time']));// 支付时间
$order_service_status = 2;// 2:未开始
if (empty($message['amount'])){
Db::rollBack();
Log::getInstance("CallBack-wxPayServiceSuccess")->error("无支付金额");
return $this->wxPayErrorReturn("无支付金额");
}
} elseif ($message['trade_state'] == "CLOSED") {
// 已关闭
$pay_status = 6;
} elseif ($message['trade_state'] == "REVOKED") {
// 已撤销(付款码支付)
$pay_status = 7;
} elseif ($message['trade_state'] == "USERPAYING") {
// 用户支付中(付款码支付)
$pay_status = 3;
} elseif ($message['trade_state'] == "PAYERROR") {
// 支付失败(其他原因,如银行返回失败)
$pay_status = 4;
} else {
Db::rollBack();
return $server->serve();
}
$data = array();
$data['pay_status'] = $pay_status;
if (isset($order_service_status)){
$data['order_service_status'] = $order_service_status;
}
if (isset($pay_time)){
$data['pay_time'] = $pay_time;
}
$data['escrow_trade_no'] = $message['transaction_id'];
$data['updated_at'] = date('Y-m-d H:i:s', time());
$params = array();
$params['order_service_id'] = $order_service_package['order_service_id'];
OrderServicePackage::edit($params, $data);
// 修改订单表
$data = array();
$data['pay_status'] = $pay_status;
if (isset($pay_time)){
$data['pay_time'] = $pay_time;
}
$data['escrow_trade_no'] = $message['transaction_id'];
$data['updated_at'] = date('Y-m-d H:i:s', time());
$params = array();
$params['order_no'] = $order_service_package['order_service_no'];
Order::edit($params,$data);
// 获取检测病例数据
$params = array();
$params['order_service_id'] = $order_service_package['order_service_id'];
$order_service_package_case = OrderServicePackageCase::getOne($params);
if (empty($order_service_package_case)) {
Db::rollBack();
Log::getInstance("CallBack-wxPayServiceSuccess")->error("问诊病例数据错误");
return $server->serve();
}
$order_service_package_case = $order_service_package_case->toArray();
// 获取患者家庭成员信息表-健康情况
$params = array();
$params['family_id'] = $order_service_package['family_id'];
$patient_family_health = PatientFamilyHealth::getOne($params);
// 获取患者家庭成员信息表-个人情况
$params = array();
$params['family_id'] = $order_service_package['family_id'];
$patient_family_personal = PatientFamilyPersonal::getOne($params);
// 获取家庭成员是否存在
$params = array();
$params['family_id'] = $order_service_package['family_id'];
$params['patient_id'] = $order_service_package['patient_id'];
$patient_family = PatientFamily::getOne($params);
if (empty($patient_family)) {
Db::rollBack();
Log::getInstance("CallBack-wxPayServiceSuccess")->error("家庭成员数据错误");
return $server->serve();
}
$generator = $this->container->get(IdGeneratorInterface::class);
// 生成订单表
$data = array();
$data['user_id'] = $order_service_package['user_id'];
$data['patient_id'] = $order_service_package['client_user_id'];
$data['doctor_id'] = $order_service_package['doctor_id'];
if ($order_service_package['order_service_type'] == 1){
$data['order_type'] = 5; // 订单类型1:问诊订单 2:药品订单 3:检测订单 4:随访包订单 5:健康包订单)
}else{
$data['order_type'] = 4; // 订单类型1:问诊订单 2:药品订单 3:检测订单 4:随访包订单 5:健康包订单)
}
$data['inquiry_pay_channel'] = 3; // 支付渠道1:小程序支付 2:微信扫码支付)
$data['pay_status'] = 2; // 1:待支付
$data['order_no'] = "I" . $generator->generate(); // 订单编号
$data['amount_total'] = 0; // 订单金额
$data['coupon_amount_total'] = 0; // 优惠卷总金额
$data['payment_amount_total'] = 0; // 实际付款金额
$order = Order::addOrder($data);
if (empty($order)) {
Db::rollBack();
Log::getInstance("CallBack-wxPayServiceSuccess")->error("订单创建失败");
return $server->serve();
}
// 创建问诊订单
$data = array();
$data['user_id'] = $order_service_package['user_id'];
$data['patient_id'] = $order_service_package['patient_id'];
$data['doctor_id'] = $order_service_package['doctor_id'];
$data['family_id'] = $order_service_package['family_id'];
$data['inquiry_type'] = 1; // 订单类型1:专家问诊 2:快速问诊 3:公益问诊 4:问诊购药 5:检测)
if ($order_service_package['order_service_type'] == 1){
$data['inquiry_mode'] = 8; // 接诊方式1:图文 2:视频 3:语音 4:电话 5:会员 6:疑难会诊 7:附赠 8:健康包 9:随访包)
}else{
$data['inquiry_mode'] = 9; // 接诊方式1:图文 2:视频 3:语音 4:电话 5:会员 6:疑难会诊 7:附赠 8:健康包 9:随访包)
}
$data['inquiry_status'] = 3; // 问诊订单状态1:待支付 2:待分配 3:待接诊 4:已接诊 5:已完成 6:已结束 7:已取消)
$data['inquiry_pay_channel'] = 3; // 支付渠道1:小程序支付 2:微信扫码支付 3:模拟支付)
$data['inquiry_pay_status'] = 2; // 支付状态1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款)
$data['inquiry_no'] = $order['order_no'];// 订单编号
$data['escrow_trade_no'] = "GD" . $generator->generate(); // 第三方支付流水号
$data['amount_total'] = 0;// 订单金额
$data['coupon_amount_total'] = 0;// 优惠卷总金额
$data['payment_amount_total'] = 0;// 实际付款金额
$data['pay_time'] = date('Y-m-d H:i:s', time());// 支付时间
$data['reception_time'] = date('Y-m-d H:i:s', time());// 接诊时间
$data['patient_name'] = $patient_family['card_name'];// 患者姓名-就诊人
$data['patient_name_mask'] = $patient_family['card_name_mask'];// 患者姓名-就诊人(掩码)
$data['patient_sex'] = $patient_family['sex'];// 患者性别-就诊人0:未知 1:男 2:女)
$data['patient_age'] = $patient_family['age'];// 患者年龄-就诊人
$order_inquiry = OrderInquiry::addOrderInquiry($data);
if (empty($order_inquiry)) {
Db::rollBack();
Log::getInstance("CallBack-wxPayServiceSuccess")->error("订单创建失败");
return $server->serve();
}
// 增加患者问诊病例
$data = array();
$data['user_id'] = $order_service_package['user_id'];
$data['patient_id'] = $order_service_package['client_user_id'];
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];// 订单-问诊id
$data['family_id'] = $patient_family['family_id']; // 家庭成员id
$data['relation'] = $patient_family['relation']; // 与患者关系1:本人 2:父母 3:爱人 4:子女 5:亲戚 6:其他
$data['name'] = $patient_family['card_name']; // 患者名称
$data['sex'] = $patient_family['sex']; // 患者性别0:未知 1:男 2:女)
$data['disease_class_id'] = $order_service_package_case['disease_class_id']; // 疾病分类id-系统
$data['disease_class_name'] = $order_service_package_case['disease_class_name']; // 疾病名称-系统
$data['diagnosis_date'] = $order_service_package_case['diagnosis_date']; // 确诊日期
$data['disease_desc'] = $order_service_package_case['disease_desc']; // 病情描述(主诉)
$data['diagnose_images'] = $order_service_package_case['diagnose_images'] ?? ""; // 复诊凭证(多个使用逗号分隔)
if ($patient_family['age'] != null) {
$data['age'] = getIdCardAge($patient_family['id_number']);// 患者年龄
}
// 身高cm
if ($patient_family['height'] != null) {
$data['height'] = $patient_family['height'];
}
// 体重kg
if ($patient_family['weight'] != null) {
$data['weight'] = $patient_family['weight'];
}
// 职业id-职业名称
if ($patient_family['job_id'] != null) {
$data['job_id'] = $patient_family['job_id'];
if ($patient_family['job_name'] != null) {
$data['job_name'] = $patient_family['job_name'];
}
}
// 民族id-民族名称
if ($patient_family['nation_id'] != null) {
$data['nation_id'] = $patient_family['nation_id'];
if ($patient_family['nation_name'] != null) {
$data['nation_name'] = $patient_family['nation_name'];
}
}
// 婚姻状况
if ($patient_family['marital_status'] != null) {
$data['marital_status'] = $patient_family['marital_status'];
}
// 家庭成员-健康情况
if (!empty($patient_family_health)) {
if ($patient_family_health['diagnosis_hospital'] != null) {
$data['diagnosis_hospital'] = $patient_family_health['diagnosis_hospital']; // 确诊医院
}
if ($patient_family_health['is_take_medicine'] != null) {
$data['is_take_medicine'] = $patient_family_health['is_take_medicine']; // 正在服药
if ($patient_family_health['drugs_name'] != null) {
$data['drugs_name'] = $patient_family_health['drugs_name']; // 正在服药名称
}
}
}
// 家庭成员-个人情况
if (!empty($patient_family_personal)) {
if ($patient_family_personal['drink_wine_status'] != null) {
$data['drink_wine_status'] = $patient_family_personal['drink_wine_status']; // 饮酒状态
}
if ($patient_family_personal['smoke_status'] != null) {
$data['smoke_status'] = $patient_family_personal['smoke_status']; // 吸烟状态
}
if ($patient_family_personal['chemical_compound_status'] != null) {
$data['chemical_compound_status'] = $patient_family_personal['chemical_compound_status']; // 化合物状态
if ($patient_family_personal['chemical_compound_describe'] != null) {
$data['chemical_compound_describe'] = $patient_family_personal['chemical_compound_describe']; // 化合物描述
}
}
if ($patient_family_personal['is_operation'] != null) {
$data['is_operation'] = $patient_family_personal['is_operation']; // 是否存在手术
if ($patient_family_personal['operation'] != null) {
$data['operation'] = $patient_family_personal['operation']; // 手术描述
}
}
}
// 过敏史
if (array_key_exists("is_allergy_history", $order_service_package_case)) {
if ($order_service_package_case['is_allergy_history'] !== null) {
$data['is_allergy_history'] = $order_service_package_case['is_allergy_history']; // 是否存在过敏史0:否 1:是)
if ($order_service_package_case['allergy_history'] != "") {
$data['allergy_history'] = $order_service_package_case['allergy_history']; // 过敏史描述
}
}
}
// 家族病史
if (array_key_exists("is_family_history", $order_service_package_case)) {
if ($order_service_package_case['is_family_history'] !== null) {
$data['is_family_history'] = $order_service_package_case['is_family_history']; // 是否存在家族病史0:否 1:是)
if ($order_service_package_case['family_history'] != "") {
$data['family_history'] = $order_service_package_case['family_history']; // 家族病史描述
}
}
}
$order_inquiry_case = OrderInquiryCase::addOrderInquiryCase($data);
if (empty($order_inquiry_case)) {
Db::rollBack();
Log::getInstance("CallBack-wxPayServiceSuccess")->error("订单创建失败");
return $server->serve();
}
// 加入未接诊取消订单延迟队列
$time = 60 * 60 * 24;
if (\Hyperf\Config\config('app_env') == "dev"){
$time = 60 * 10;
}
$data = array();
$data['order_inquiry_id'] = $order_inquiry['order_inquiry_id'];
$data['order_no'] = $order_inquiry['inquiry_no'];
$message = new CancelUnInquiryOrdersDelayDirectProducer($data);
$message->setDelayMs(1000 * $time);
$producer = $this->container->get(Producer::class);
$res = $producer->produce($message);
if (!$res) {
Db::rollBack();
Log::getInstance("CallBack-wxPayServiceSuccess")->error("订单创建失败");
return $server->serve();
}
Db::commit();
} catch (\Exception $e) {
// 验证失败
Db::rollBack();
Log::getInstance("CallBack-wxPayServiceSuccess")->error("问诊微信支付回调数据处理失败:" . $e->getMessage());
return $this->wxPayErrorReturn($e->getMessage());
}
Log::getInstance("CallBack-wxPayServiceSuccess")->info("检测微信支付回调处理成功");
return $server->serve();
}
}

View File

@ -0,0 +1,85 @@
<?php
declare(strict_types=1);
namespace App\Model;
use Carbon\Carbon;
use Hyperf\Database\Model\Collection;
use Hyperf\Snowflake\Concern\Snowflake;
/**
* @property int $service_refund_id 主键id
* @property int $patient_id 患者id
* @property int $order_service_id 订单-服务包id
* @property string $order_service_no 系统订单编号
* @property string $service_refund_no 系统退款编号
* @property string $refund_id 第三方退款单号
* @property int $refund_status 订单退款状态0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常)
* @property string $refund_total 退款金额
* @property string $refund_reason 退款原因
* @property string $success_time 退款成功时间
* @property Carbon $created_at 创建时间
* @property Carbon $updated_at 修改时间
*/
class OrderServicePackageRefund extends Model
{
use Snowflake;
/**
* The table associated with the model.
*/
protected ?string $table = 'order_service_package_refund';
/**
* The attributes that are mass assignable.
*/
protected array $fillable = ['service_refund_id', 'patient_id', 'order_service_id', 'order_service_no', 'service_refund_no', 'refund_id', 'refund_status', 'refund_total', 'refund_reason', 'success_time', 'created_at', 'updated_at'];
protected string $primaryKey = "service_refund_id";
/**
* 获取信息-单条
* @param array $params
* @param array $fields
* @return object|null
*/
public static function getOne(array $params, array $fields = ['*']): object|null
{
return self::where($params)->first($fields);
}
/**
* 多条
* @param array $params
* @param array $fields
* @return Collection|array
*/
public static function getList(array $params, array $fields = ['*']): Collection|array
{
return self::where($params)->get($fields);
}
/**
* 新增
* @param array $data
* @return OrderServicePackageRefund|\Hyperf\Database\Model\Model
*/
public static function addOrderServicePackageRefund(array $data): \Hyperf\Database\Model\Model|OrderServicePackageRefund
{
return self::create($data);
}
/**
* 修改
* @param array $params
* @param array $data
* @return int
*/
public static function edit(array $params = [], array $data = []): int
{
return self::where($params)->update($data);
}
}

View File

@ -13,6 +13,8 @@ use App\Model\OrderInquiryRefund;
use App\Model\OrderProduct;
use App\Model\OrderProductRefund;
use App\Model\OrderRefund;
use App\Model\OrderServicePackage;
use App\Model\OrderServicePackageRefund;
use App\Utils\Log;
use Extend\Wechat\WechatPay;
use Hyperf\Amqp\Result;
@ -490,6 +492,25 @@ class OrderService extends BaseService
$params['detection_no'] = $order['order_no'];
OrderDetectionRefund::edit($params, $data);
break;
case 4: // 服务包订单
// 修改订单
$data = array();
$data['refund_status'] = $refund_status;
$params = array();
$params['order_service_no'] = $order['order_no'];
OrderServicePackage::edit($params, $data);
// 修改退款订单
$data = array();
$data['detection_refund_status'] = $refund_status;
$data['success_time'] = $success_time;
$params = array();
$params['order_service_no'] = $order['order_no'];
OrderServicePackageRefund::edit($params, $data);
break;
default:
throw new BusinessException("订单类型错误");

View File

@ -606,4 +606,5 @@ class OrderServicePackageService extends BaseService
return $result;
}
}

View File

@ -1080,7 +1080,7 @@ class PatientOrderService extends BaseService
if ($order_service_package['payment_amount_total'] > 0) {
// 发起支付
$WechatPay = new WechatPay(1, 3);
$WechatPay = new WechatPay(1, 4);
// 获取预支付交易会话标识
$prepay = $WechatPay->getJsapiPrepayId($order_no, (int)round($order_service_package['payment_amount_total'] * 100), $user_info['open_id'], "检测服务");
@ -1091,7 +1091,6 @@ class PatientOrderService extends BaseService
// 获取小程序支付配置
$pay_config = $WechatPay->getAppletsPayConfig($prepay['prepay_id']);
}
}
$result['pay_config'] = $pay_config ?? [];

View File

@ -30,6 +30,8 @@ class Auth
"/callback/wxpay/product/refund" => "post", // 微信药品退款回调
"/callback/wxpay/detection/success" => "post", // 微信检测订单支付回调
"/callback/wxpay/detection/refund" => "post", // 微信检测订单退款回调
"/callback/wxpay/service/success" => "post", // 微信服务包订单支付回调
"/callback/wxpay/service/refund" => "post", // 微信服务包订单退款回调
"/callback/im" => "post", // im回调
"/callback/platform/logistics" => "post", // 处方平台物流回调
"/callback/logistics" => "post", // 快递100订阅回调

View File

@ -768,6 +768,15 @@ Router::addGroup('/callback', function () {
// 退款回调
Router::post('/refund', [CallBackController::class, 'wxPayDetectionRefundCallBack']);
});
// 服务包
Router::addGroup('/service', function () {
// 支付成功回调
Router::post('/success', [CallBackController::class, 'wxPayServiceSuccessCallBack']);
// 退款回调
Router::post('/refund', [CallBackController::class, 'wxPayServiceRefundCallBack']);
});
});
// im聊天回调

View File

@ -28,7 +28,7 @@ class WechatPay
/**
* @param string $user_type 用户类型1患者端 2:专家端 3:药师端)
* @param int $order_type 订单类型1:问诊订单 2:药品订单 3:检测订单 4:随访包订单 5:健康包订单)
* @param int $order_type 订单类型1:问诊订单 2:药品订单 3:检测订单 4:服务包订单)
*/
public function __construct(string $user_type,int $order_type)
{
@ -69,7 +69,7 @@ class WechatPay
$this->pay_config = config("we_chat.applets.pay.1636644248");
}
if ($order_type == 4 || $order_type == 5){
if ($order_type == 4){
$this->pay_notify_url = $this->config['service_pay_notify_url'];
$this->refund_notify_url = $this->config['service_refund_notify_url'];