开始
- 我们到微信公众号下载SDK;
- 现在我们分两个框架
CI
和TP
;(CI框架我们把SDK放到common
下的libraries
下);(TP框架我们把SDK放到根目录extend
下) CI
框架的操作流程
/**
* 微信退款流程
*/
public function refund_pay() {
//获取当前订单的ID
$order_id = $this->input->get('id', true);
//查询当前订单的信息
$order = $this->common_model->get_one('order', array('order_id' => $order_id));
//判断这条订单是否存在,并存日志(如果不想存日志直接给个提示就行)
if (empty($order)) {
$this->log->save_log('根据订单ID查询不到信息', $log_file = RUN_QUERY_LOG, $level = 'DEBUG');
return FALSE;
}
//微信退款操作
require_once ROOT_PATH . "/common/libraries/wxpay/lib/WxPay.Api.php";
$input = new WxPayRefund();
$out_trade_no = WxPayConfig::MCHID . date("YmdHis") . mt_rand(10000, 99999);
//设置商户系统内部的退款单号,商户系统内部唯一,同一退款单号多次请求只退一笔
$input->SetOut_refund_no($out_trade_no);
//设置商户系统内部的订单号,transaction_id、out_trade_no二选一
$input->SetTransaction_id($orderArr['out_sn']);
//设置订单总金额,单位为分,只能为整数,详见支付金额
$input->SetTotal_fee($orderArr['pay_price'] * 100);
//设置退款总金额,订单总金额,单位为分,只能为整数,详见支付金额
$input->SetRefund_fee($orderArr['weixin_pay_price'] * 100);
//设置操作员帐号, 默认为商户号
$input->SetOp_user_id(WxPayConfig::MCHID);
$data = WxPayApi::refund($input);
//退款成功
if ($data['result_code'] == 'SUCCESS') {
//更新订单状态
$this->common_model->edit('order', array('return_time' => date('Y-m-d H:i:s', time())), array('order_id' => $order_id));
}
4.TP
框架的操作流程
/**
* 支付宝有密退款流程
*/
namespace app\controller;
use think\Db;
use wxpay\Wxpay;
class RefundController extends Controller{
/**
* 订单确认页面
*/
public function index() {
//获取当前订单ID
$out_id = input('param.id');
//获取当前订单基本信息
$outOrder = db('out_order')->field('oto.*,o.*')->alias('oto')->where(['out_id' => $out_id])->join('__ORDER__ o', 'o.order_id=oto.order_id')->find();
//判断订单是否存在
if (empty($outOrder)) {
$this->error('该订单不存在', '', '', '');
}
//判断订单是否重复提交
if ($outOrder['state'] == '110' && $outOrder['out_status'] == '1') {
$this->error('请勿重复提交订单', '', '', '');
}
$data = [
'refund_no' => date('Ymdhis', time()) . substr(floor(microtime() * 1000), 0, 1) . rand(0, 9),
//退款数量
'refund_num' => '1',
//buyer_id买家支付宝账号或者iD^out_price退款金额^'备注'
'refund_data' => $outOrder['buyer_id'] . '^' . $outOrder['out_price'] . '^' . '测试退款',
];
return $this->fetch('outorder/refund', $data);
}
/**
* 确认支付
* 发送请求到支付宝(会跳转到支付宝页面等待用户支付)
*/
public function refund() {
require_once EXTEND_PATH . 'Alipay_refund/alipayapi.php';
}
/**
* 支付宝异步回调方法
*/
public function notifyurl() {
require_once EXTEND_PATH . 'Alipay_refund/notify_url.php';
$alipayNotify = (new AlipayNotify())->verifyReturn();
$alipayNotify->verifyReturn();
}
}