去官网下载easyWechat(我下的是4.x版本)
composer require overtrue/wechat:~4.0 -vvv
开始使用,先封装代码
public function init() // 支付配置初始化 { $config = [ // 必要配置 'app_id' => config('xcx_appid'), 'mch_id' => config('mch_id'), 'key' => config('pay_secret'), // API 密钥 // 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书) 'cert_path' => '/www/wwwroot/项目名/extend/cert/apiclient_cert.pem', // XXX: 绝对路径!!!! 'key_path' => '/www/wwwroot/项目名/extend/cert/apiclient_key.pem', // XXX: 绝对路径!!!! 'notify_url' => '域名/callback', // 你也可以在下单时单独设置来想覆盖它 ]; $app = Factory::payment($config); return $app; } //写日志 public function logs($msg, $type = 'info') { Log::init([ 'type' => 'File', 'path' => Env::get('root_path') . 'testLog', 'max_files' => 20, ]); Log::write($msg, $type); Log::close(); }
前端请求pay 接口
public function pay() // 统一支付接口 { $app = $this->init(); $orderId = time(); $result = $app->order->unify([ // H5 支付,公众号支付,扫码支付,支付中签约,全部都是用这个接口下单。 'body' => '测试支付', 'out_trade_no' => $orderId, // 商户订单号 'total_fee' => 1, // 金额 分 'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型 'openid' => '你的openId', //'spbill_create_ip' => '123.12.12.123', // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址 //'notify_url' => 'https://pay.weixin.qq.com/wxpay/pay.action', // 支付结果通知网址,如果不设置则会使用配置里的默认地址 ]); $res = Order::create(['orderId' => $orderId, 'status' => 0,'userId'=>random_int(1,10000)]); // 生成未支付的订单 if ($result['return_code'] != 'SUCCESS' || $result['result_code'] != 'SUCCESS') return json(['code' => 1, 'msg' => '获取支付订单失败']); else { if ($res) { // 返回给前端,生成支付页面 $jssdk = $app->jssdk; $config = $jssdk->bridgeConfig($result['prepay_id'], false); return ($config); } else return json(['code' => 1, 'msg' => '创建订单失败!']); } } //支付回调 public function callBack() { $app = $this->init(); $response = $app->handlePaidNotify(function ($message, $fail) use ($app){ // 回调 $order = Order::where(['orderId' => $message['out_trade_no']])->find()->toArray(); if (!$order || $order['status'] == 1) // 如果订单不存在 或者 订单已经支付过了 return true; // 告诉微信,我已经处理完了,订单没找到,别再通知我了 //$res = $app->order->queryByOutTradeNumber($message['out_trade_no']); // 订单查询 if ($message['return_code'] === 'SUCCESS' ) { // return_code 表示通信状态,不代表支付状态 if ($message['result_code'] === 'SUCCESS') { // 支付成功 $order['status'] = 1; $this->logs('商户订单号:'.$message['out_trade_no'].' 支付成功'); } else{ // 支付失败 $order['status'] = -1; $this->logs('商户订单号:'.$message['out_trade_no'].' 支付失败'); } Order::update($order,['orderId'=>$message['out_trade_no']]); // 更新数据 } else // 通讯失败 return $this->create([],'connect fail'); return true; // 返回处理完成 }); return $response; }
pay: function () { wx.request({ url: 'http://域名/pay', header: { "X-Requested-With": " XMLHttpRequest" }, data: { }, success(res) { console.log(res.data) let ress = res.data //let ress = JSON.parse(res.data) // console.log(ress.data) wx.requestPayment({ // 生成支付页面的参数 "timeStamp": ress.timeStamp, "nonceStr": ress.nonceStr, "package": ress.package, "signType": ress.signType, "paySign": ress.paySign, 'appId': ress.appId, "success": function (res) { console.log(res) }, "fail": function (res) { console.log(res) }, "complete": function (res) { console.log(res) } }) } }) },
可以通过接口工具请求,传入支付的订单号即可
//退款 public function refund() { $out_trade_no = '1628739348'; // 商户订单号 $app = $this->init(); // 参数分别为:商户订单号、商户退款单号、订单金额、退款金额、其他参数 $result = $app->refund->byOutTradeNumber($out_trade_no, uniqid(), 1, 1, [ 'refund_desc' => '退款', 'notify_url' => 'http://域名/refundBack', ]); if ($result['return_code'] == 'SUCCESS') return true; else{ $this->logs('退款失败','error'); return false; } } //退款回调 public function refundBack(){ $app = $this->init(); $response = $app->handleRefundedNotify(function ($message, $reqInfo, $fail) { // 其中 $message['req_info'] 获取到的是加密信息 // $reqInfo 是解密后的信息 $order = Order::where(['orderId' => $reqInfo['out_trade_no']])->find()->toArray(); if (!$order || $order['status'] == 2) // 如果订单不存在 或者 订单已经退款了 return true; // 告诉微信,我已经处理完了,订单没找到,别再通知我了 if($message['return_code']=='SUCCESS'){ // 通信成功 if($reqInfo['refund_status']=='SUCCESS'){ $order['status'] = 2; $this->logs('商户订单号:'.$reqInfo['out_trade_no'].' 退款成功'); }else{ $order['status'] = -2; $this->logs('商户订单号:'.$reqInfo['out_trade_no'].' 退款失败'); } Order::update($order,['orderId'=>$reqInfo['out_trade_no']]); // 更新数据 } else // 通讯失败 return $this->create([],'connect fail'); return true; // 返回 true 告诉微信“我已处理完成” // 或返回错误原因 $fail('参数格式校验错误'); }); return $response; }