支付总结之微信支付(微信单笔收款)

单笔收款

    在收银台开发过程中,整理了微信单笔收款的整个项目流程,很实用哟,注意下面有些方法或者类需要引入微信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,并且记录日志。并且支付之前一定要验证订单的状态(过期或者已支付着重考虑),并且金额和订单金额一致。凡是涉及到金额问题一定要再三考虑。

posted @ 2017-07-18 13:25  独善-其身  阅读(2010)  评论(0编辑  收藏  举报