网上现有许多laravel的微信支付都是以前的版本,我就把新的捋一遍啊。
composer中配置的是
"overtrue/laravel-wechat": "^4.0",
基础配置不说了,网上都有,说一下使用吧。
jssdk:
public function getJssdk(Request $request)
{
$app = new Application(get_weixin_config());
$app->jssdk->setUrl($request->url);
return $this->ok($app->jssdk->buildConfig(['chooseImage','onMenuShareAppMessage', 'onMenuShareQQ', 'showMenuItems', 'hideAllNonBaseMenuItem'], false, false, false));
}
简略写法,一些参数有的不需要的自己选择。
1.微信支付:
public function pay($body, $detail, $out_trade_no, $total_fee, $productId , $trade_type , $openid='')
{
$app = new Application(get_weixin_config());
//创建订单
$attributes = [
'trade_type' => $trade_type, // JSAPI,NATIVE,APP...
'body' => $body,
'detail' => $detail,
'out_trade_no' => $out_trade_no,
'total_fee' => $total_fee, // 单位:分
'notify_url' => url('pay/wxpay_notify'),
'product_id' => $productId,
'openid' => $openid, // trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识,
];
$result = $app->order->unify($attributes);
if( $result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS'){
if ($trade_type == 'JSAPI'){
$config = $app->jssdk->bridgeConfig($result['prepay_id'], false); // 生成支付 JS 配置
return $config;
}
return $result;
}else{
Log::error('微信支付签名失败:'.var_export($result,1));
return false;
}
}
微信支付我是把jaspi和native写在一起了,注意jssdk需要传openid,拿到paepay_id后还要再做操作。
2.微信回调
public function wxpay_notify(Request $request)
{
$app = Factory::payment(get_weixin_config());
$response = $app->handlePaidNotify(function ($notify, $fail) {
$out_trade_no = $notify['out_trade_no']; // 商户订单号
$trade_no = $notify['transaction_id']; // 微信支付订单号
$order = 我先在数据库里查询了自己的订单信息
if (empty($order)) {
return true; // 告诉微信,我已经处理完了,订单没找到,别再通知我了
}
if ($notify['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
// 用户是否支付成功
if (array_get($notify, 'result_code') === 'SUCCESS') {
//加入自己支付完成后该做的事
}
} else {
return $fail('通信失败,请稍后再通知我');
}
return true;
});
return $response;
}
3.微信查询,PC上扫码支付成功后不会主动跳转,只能自己写个js查询啦。
public function wxpay_query(Request $request)
{
$app = Factory::payment(get_weixin_config());
$response = $app->order->queryByOutTradeNumber($request->order_no);
if ($response['return_code'] == 'SUCCESS' && $response['result_code'] == 'SUCCESS') {
if ($response['trade_state'] == 'SUCCESS') {
//如果需要加入后续支付成功步骤的话自己加
return $this->ok();
}else {
return $this->fail();
}
}else {
return $this->fail();
}
}
原创文章,转发请注明出处。