zoukankan      html  css  js  c++  java
  • 支付总结之微信支付(微信单笔收款)

    单笔收款

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

  • 相关阅读:
    sql server 2008 r2安装详解 (转)
    SQL SERVER 与ORACLE常用函数比较(转)
    android色码对照表
    java小结
    如何查看android虚拟机的目录及文件
    java中的Serializable接口的作用
    android布局属性详解
    android 如何连接sqlserver数据库
    android 中Network error IOException: failed to connect to /127.0.0.1 (port 1433): connect failed: ECONNREFUSED (Connection refused)
    IDEA 将项目打包war包
  • 原文地址:https://www.cnblogs.com/libinblogs/p/7200010.html
Copyright © 2011-2022 走看看