調試工具可以使用微信web開發(fā)者工具https://mp.weixin.qq.com/wiki/10/e5f772f4521da17fa0d7304f68b97d7e.html#.E4.B8.8B.E8.BD.BD.E5.9C.B0.E5.9D.80
- 支付前準備
- 微信支付,要求有服務號,且認證后的.
當申請支付功能后, 會收到2個參數(shù), 商戶id,和商戶key.
注意,這2個參數(shù),不要和微信的參數(shù)混淆.
微信參數(shù): appid, appkey, token
支付參數(shù): merchant_id(商戶號), key(支付密鑰)- 開發(fā)中支付密鑰怎么得到?
答: 找老板要(用戶或者公司有用來測試)
到 https://pay.weixin.qq.com -->賬戶中心-->API安全-->設置API密鑰
自行設置一個32位的密鑰- 在微信支付-開發(fā)配置-配置測試授權目錄(測試域名)揽咕,測試白名單('用來支付測試'),支付授權目錄先不用填仍源,測試跑通之后再填心褐;
- 支付思路(https://easywechat.org/zh-cn/docs/payment.html)
在wechat中的支付流程:
- 得到支付對象payment
- 把訂單對象order(訂單號,金額,openid,放在
$attributes
以參數(shù)傳入),- 預處理,得到一個預處理id,
payment->prepare(order)
;- 生成json配置
- 把json寫在模板中,觸發(fā)js
如下:
//前端頁面添加js
xxForm.onsubmit = function() {
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {!!$json!!},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {
// 使用以上方式判斷前端返回,微信團隊鄭重提示:
// res.err_msg將在用戶支付成功后返回
// ok,但并不保證它絕對可靠笼踩。
}
}
);
return false;
}
3 demo
//done頁面處理支付準備
public function done() {
if( !$req->session()->has('user') ) {//判斷是否有用戶名
return redirect('center');
}
//接收POST數(shù)據(jù)(如地址逗爹,手機號,姓名)和登陸用戶的session數(shù)據(jù)(如uid)嚎于,寫入orders表
$order = new Order();
$order->ordsn = date('Ymd').mt_rand(1000000,9999999);
//用戶信息
//dd(session()->get('user'));
$order->openid = session()->get('user')['id'];
$order->xm = $req->xm;//用戶姓名
$order->tel = $req->mobile;//用戶電話
$order->address = $req->address;//用戶地址
$order->money = Cart::getTotal();//總價
$order->ispay = 0;//未支付
$order->ordtime = time(); //訂單生成時間
$order->save();//插入數(shù)據(jù)庫orders表
//相應產(chǎn)品插入到items表
$goods = Cart::getContent();//所有購物車商品(購物車只能全結賬)
foreach($goods as $v){
$item = new Item();
$item->oid = $order->oid;//訂單的自增id
$item->gid = $v['id'];//訂單id
$item->goods_name = $v['name'];//商品名稱
$item->price = $v['price'];//商品價格
$item->amount = $v['quantity'];//商品數(shù)量
$item->save();
}
Cart::clear();//清空購物車
// 準備微信支付
// 1.創(chuàng)建支付對象
$payment = $this->app->payment;
// 2. 創(chuàng)建訂單對象
$attributes = [
'trade_type' => 'JSAPI', // JSAPI掘而,NATIVE,APP...
'body' => '鮮花',
'detail' => '好多鮮花',
'out_trade_no' => $order->ordsn,
'total_fee' => intval($order->money*100),
'openid' =>$order->openid,
'notify_url' => 'http://7de41313.ittun.com/pay',//支付完成回調url
// ...
];
$wxorder = new WxOrder($attributes);
// 3. 預處理
$result = $payment->prepare($wxorder);
if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS
$prepayId = $result->prepay_id;
}
// 4. 得到支付的JS配置
$json = $payment->configForPayment($prepayId);
return view('done' , ['ordsn'=>$order->ordsn , 'json'=>$json]);
}
// JS調用
$('form').submit(function(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {!!$json!!},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {
// 使用以上方式判斷前端返回,微信團隊鄭重提示:
// res.err_msg將在用戶支付成功后返回
// ok于购,但并不保證它絕對可靠袍睡。
}
}
);
return false;
});
public function pay(Request $req){
//調用微信支付接口
//先默認支付完成
$order = Order::where('ordsn',$req->ordsn)->first();
$order->ispay = 1;//修改訂 單狀態(tài)為支付
$order->save();
$money = $order->money;//獲取支付金額
$openid = session()->get('user')['id'];//當前微信的openid
$user = User::where('openid',$openid)->first();
//分錢
foreach(['0.5'=>$user->p1,'0.25'=>$user->p2,'0.1'=>$user->p3] as $rate=>$p){
if($p > 0) {
$fee = new Fenxiao();
$fee->uid = $p;//受益人id
$fee->byid= $user->uid;//購買者id
$fee->oid= $order->oid;//訂單 id
$fee->money= $order->money * $rate;//受益者分得資產(chǎn)
$fee->save();
}
return '購物成功';
}
}
//pay函數(shù)處理支付回調
public function pay(Request $req){
//支付完成處理回調函數(shù)
$response = $app->payment->handleNotify(function($notify, $successful){
//out_trade_no為商家訂單號
$order = Order::where('ordsn',$notify->out_trade_no)->first();
if (!$order) { // 如果訂單不存在
return '支付失敗';
}
$order->ispay = 1;//修改訂單狀態(tài)為支付
$order->save();
$money = $order->money;//獲取支付金額
$openid = session()->get('user')['id'];//當前微信的openid
$user = User::where('openid',$openid)->first();
//分錢
foreach(['0.5'=>$user->p1,'0.25'=>$user->p2,'0.1'=>$user->p3] as $rate=>$p){
if($p > 0) {
$fee = new Fenxiao();
$fee->uid = $p;//受益人id
$fee->byid= $user->uid;//購買者id
$fee->oid= $order->oid;//訂單 id
$fee->money= $order->money * $rate;//受益者分得資產(chǎn)
$fee->save();
}
}
});
}