/**
* 小程序支付
* token 用户token
*/
public function small_pay()
{
$user_id = user_decrypt(request()->param('token'));
$payment = Factory::payment(config('wechat'));
$order_no = request()->param('order_no'); //获取子订单号
$order_info = Db::name('order_son') ->where('son_no',$order_no)->find();
$money = $order_info['payment'];
//获取用户openid
$openid = Db::name('customer')->where('id',$user_id)->value('openid');
$result = $payment->order->unify([
'body' => '购买套餐',
'out_trade_no' => $pay_no,
'total_fee' => $money * 100, //订单金额
'spbill_create_ip' => '', // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
'notify_url' => 'http://******/api/wechat/weChat_notify_url', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
'openid' => $openid,
]);
$jssdk = $payment->jssdk;
if ($result['return_code'] == 'SUCCESS' && $result['result_code']== 'SUCCESS'){
$prepayId = $result['prepay_id'];
$config = $jssdk->bridgeConfig($prepayId, false); // 返回数组
return_json(1,'获取支付配置成功!',$config);
}else{
return_json(0,'获取支付配置失败');
}
}
/**
* Class WeChatPay
* @package app\home\controller\user
* 微信PC支付
*/
public function weChat_page_pay()
{
$app = Factory::payment(config('wechat'));
$order_no = request()->param('order_no'); //获取子订单号
$order_id = request()->param('order_id'); //获取子订单id作为商品id
$order_info = Db::name('order_son') ->where('son_no',$order_no)->find();
$money = $order_info['payment'];
$result = $app->order->unify([
'body' => '购买套餐',
'out_trade_no' => $pay_no,
'total_fee' => $money*100, //价格
'spbill_create_ip' => '', // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
'notify_url' => 'http://*****/api/wechat/weChat_notify_url', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
'trade_type' => 'NATIVE', //扫码支付
'product_id' =>$order_id, // $message['product_id'] 则为生成二维码时的产品 ID
]);
// dump($result);exit;
if ($result['return_code'] == 'SUCCESS' && $result['result_code']== 'SUCCESS'){
return_json(1,'获取支付二维码成功',$result['code_url']);
}else{
return_json(0,'获取支付二维码失败');
}
}
/**
* 微信移动端支付(H5)
*/
public function weChat_wap_pay(){
$app = Factory::payment(config('wechat'));
$order_no = request()->param('order_no'); //获取子订单号
$order_info = Db::name('order_son') ->where('son_no',$order_no)->find();
$money = $order_info['payment'];
$result = $app->order->unify([
'body' => '购买套餐',
'out_trade_no' => $pay_no,
'total_fee' => $money, //价格
'spbill_create_ip' => '', // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
'notify_url' => 'http://*****/api/wechat/weChat_notify_url', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
'trade_type' => 'MWEB',
'scene_info' => "{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"https://laodongwuyou.com\",\"wap_name\": \"劳动无忧\"}}",//这个是H5支付场景所用
]);
$redirect_url = '';//支付后跳转地址
if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS'){
$mweb_url = $result->mweb_url . "&redirect_url=" . $redirect_url;//返回前台跳转支付的中间也,网址默认跳到发起支付的页面,加参数redirect_url后,跳到指定页面
return_json(1,'调起支付成功',$mweb_url);
}else{
return_json(0,'调起支付失败');
}
}
/**
* @throws \EasyWeChat\Kernel\Exceptions\Exception
* 微信支付结果回调
*/
public function weChat_notify_url()
{
$app = Factory::payment(config('wechat'));
$response = $app->handlePaidNotify(function($message, $fail){
// 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
$pay_no = $message['out_trade_no'];
//根据支付订单号获取平台支付订单号
$order_number = Db::name('order_son')->where('pay_no',$pay_no)->value('son_no'
if (!$order) { // 如果订单不存在 或者 订单已经支付过了
return true; // 告诉微信,我已经处理完了,订单没找到,别再通知我了
}
if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
// 否支用户是付成功
if ($message['result_code'] === 'SUCCESS') {
**//处理你的订单逻辑**
// 用户支付失败
} else if ($message['result_code'] === 'FAIL') {
//目前不做订单状态的修改
}
} else {
return $fail('通信失败,请稍后再通知我');
}
return true; // 返回处理完成
});
$response->send(); // return $response;
}
如果在多终端同时有支付的话,支付的订单号得在生成支付配置之前进行更新,保证在不同终端的支付订单号不一样,微信才不会认为订单重复