1.发起退款,使用easywechat包,退款时必须有证书,key文件,微信支付平台会在生成API证书时把文件下载到本地,平台没有保存证书及key
$config = [
'app_id' => 'XXXX',
'mch_id' => '商户号',
'key' => 'XXXXXXX',
'cert_path' => '/mnt/xxx/xxx/cert.pem',//从商家往客户转账、退款等回滚操作都key
'key_path' => '/mnt/yy/yy/key.pem',
];
//发起微信退款
public function refund($order) {
$refundParams = [];
$refundParams['transactionId'] = $order->transactionId;//微信支付流水号
$refundParams['refundNumber'] = $order->orderno;//订单号,可选
$refundParams['total'] = $order->amount * 100;
$refundParams['refundMoney'] = $order->amount * 100;
$refundParams['notify_url'] = 'https://退款回调地址';//地址不可带参数
$res = $this->orderRefund($refundParams);
if ($res['code'] !== 1) {
throw new Exception('微信退款失败-'. $res['msg']);
}
}
//发起退款申请
public function orderRefund($params) {
$app = Factory::payment($this->config);
$ret = ['code' => 1];
//根据支付流水号退款,一笔付款可以分成多次退,但总退款金额不可超过支付时的金额
$result = $app->refund->byTransactionId($params['transactionId'],
$params['refundNumber'],
$params['total'],
$params['refundMoney'] ,
['refund_desc' => '用户申请退款','notify_url' => $params['notify_url']]
);
if($result['return_code']!='SUCCESS' || $result['result_code']!='SUCCESS'){
return ['code' => 0, 'msg' => $result['err_code_des']];
}
return $ret;
}
2.支付回调
//引用包
use EasyWeChat\Factory;
//以下是回调处理
public function cbrefund(){
$config = [
'app_id' => 'AAAAA',
'mch_id' => 'XXXXX',
'key' => 'BBBBBBB',
'cert_path' => '/mnt/xxxx/xxxx.pem',//服务器绝对地址
'key_path' => '/mnt/xxxx/xxx/key.pem',
];
$app = Factory::payment($config);
$response = $app->handleRefundedNotify(function($message, $reqInfo, $fail){
// $regInfo 是解密后的数据,里面有退款单号等
if ($message['return_code'] === 'SUCCESS') {
if ($reqInfo['refund_status'] === 'SUCCESS') {
//逻辑处理....
} elseif ($message['result_code'] === 'FAIL') {
return $fail('支付失败');
}
} else {
return $fail('通信失败,请稍后再通知我');
}
return true; // 返回处理完成
})
}
easywechat包还有很多功能,如有需要可自行搜索了解