支付總結之微信支付(微信單筆收款)


單筆收款

    在收銀台開發過程中,整理了微信單筆收款的整個項目流程,很實用喲,注意下面有些方法或者類需要引入微信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,並且記錄日志。並且支付之前一定要驗證訂單的狀態(過期或者已支付着重考慮),並且金額和訂單金額一致。凡是涉及到金額問題一定要再三考慮。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM