單筆收款
在收銀台開發過程中,整理了微信單筆收款的整個項目流程,很實用喲,注意下面有些方法或者類需要引入微信cdk中的一些文件才能用。微信cdk可以去微信開發者文檔自己去下載。
掃碼支付
微信的掃碼支付原理是請求微信接口,然后得到一個二維碼地址供頁面顯示;當用戶掃碼支付成功時微信會根據用戶所填的回調地址進行回調,注意回調的地址是本地服務器,要實現訂單支付功能,保證支付完成訂單改為已經支付狀態。此時頁面需要監控回調狀態,如果訂單支付那么要做相應的處理,顯示支付成功或者其他的跳轉。主要代碼如下:
1. 二維碼生成部分
require_once LIB_ROOT . '/external/wxpayv3/example/WxPay.NativePay.php'; $notify = new NativePay(); //統一下單 $input->SetTrade_type( "NATIVE" ); $ input->SetProduct_id( $params[ 'product_id' ] );//二維碼中包含的商品ID $result = $notify->GetPayUrl( $input ); // var_dump($result); $url2 = $result["code_url"]; //返回二維碼的信息 return( $url2 );
2. 異步回調部分
require_once LIB_ROOT . '/external/wxpayv3/lib/WxPay.Api.php'; require_once LIB_ROOT . '/external/wxpayv3/lib/WxPay.Notify.php'; $msg = "OK"; //調用微信支付回調的方法,檢查簽名,並返回數據 $result = WxpayApi::notify( $msg ); if( $result ) { //愛干啥干啥(驗證金額以及支付結果支付時間是否超時等等) //返回給微信信息 Factory::writeStderr( "WXPAY_NOTIFY_OK : [ out_trade_no : {$result[ 'out_trade_no' ]}, trade_no : {$result[ 'transaction_id' ]} ]" . $msg ); $notify = new WxPayNotify(); $notify->SetReply( true, $msg, false );//$result( true/false) } else { Factory::writeStderr( "WXPAY_NOTIFY_ERROR : [ out_trade_no : {$result[ 'out_trade_no' ]}, trade_no : {$result[ 'transaction_id' ]} ]" .$ex->getMessage() ); $notify = new WxPayNotify(); $notify->SetReply( false, $ex->getMessage(), false );//$result( true/false) }
3.實時查詢訂單狀態,支付了就會進行跳轉或者其他操作,這一步主要是為了查看用戶支付狀態,用戶支付了會在回調部分修改訂單狀態,此時就會是已經支付或者支付失敗,頁面會相應作出反應(這部分要根據需求,所以代碼略)
微信公眾號支付
微信公眾號是在公眾號的基礎上進行操作,所以可以知道用戶的openid(需要授權)進而識別用戶,然后可以將付款做成按鈕的形式點擊之后就可以調用微信的jsapi來發起支付
jsapi調取部分
function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', jsApiParameters,//這個是個參數集,包括回調地址以及金額等等,需要用戶自己生成 function(res){ // 使用以上方式判斷前端返回:res.err_msg將在用戶支付成功后返回ok,但並不保證它絕對可靠。 if(res.err_msg == "get_brand_wcpay_request:ok" ) { //這邊可以跳轉到支付成功的顯示頁面 alert('支付成功'); } //get_brand_wcpay_request:cancel 支付過程中用戶取消 //get_brand_wcpay_request:fail 支付失敗 else if( res.err_msg == "get_brand_wcpay_request:cancel" || res.err_msg == "get_brand_wcpay_request:fail" ) { alert('支付失敗'); } WeixinJSBridge.log(res.err_msg); alert(res.err_code+res.err_desc+res.err_msg); } ); } function callpay() { if (typeof WeixinJSBridge == "undefined"){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall); } }else{ jsApiCall(); } }
jsApiParameters(上部分的紅色部分,就是生成的支付參數)的生成(通過php)
$tools = new JsApiPay(); $openId = $tools->GetOpenid(); //②、統一下單 $input = new WxPayUnifiedOrder(); $input->SetBody("test"); $input->SetAttach("test"); $input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis")); $input->SetTotal_fee("1"); $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); $input->SetGoods_tag("test"); $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php"); $input->SetTrade_type("JSAPI"); $input->SetOpenid($openId); $order = WxPayApi::unifiedOrder($input); echo '<font color="#f00"><b>統一下單支付單信息</b></font><br/>'; printf_info($order); $jsApiParameters = $tools->GetJsApiParameters($order);
注意事項
代碼調試階段注意引入的文件是否正確,支付完成后要做相應的訂單支付操作,失敗要返回給微信false,並且記錄日志。並且支付之前一定要驗證訂單的狀態(過期或者已支付着重考慮),並且金額和訂單金額一致。凡是涉及到金額問題一定要再三考慮。