zoukankan      html  css  js  c++  java
  • 转载【微信支付】jsapi支付之传参问题(使用微信官方SDK之PHP版本) V3之WxpayPubHelper 亲测有效,V3WxpayAPI_php_v3.zip版未测试,理论上也是一样的。

    本文转载至:http://blog.csdn.net/geeklx/article/details/51146151

    (微信支付现在分为v2版和v3版,2014年9月10号之前申请的为v2版,之后申请的为v3版。V3版的微信支付没有paySignKey参数。)

    写在最前面: V3 WxpayPubHelper 亲测有效,最新版本(WxpayAPI_php_v3.zip)未测试,理论上也是一样的。

    微信支付api真的是各种坑啊

    今天一整天都在折腾微信支付jsapi的参数不能通过get,post方式获取的问题!!

    微信网页支付在用户点击发起支付前的流程:

    问题:用户h5页面输入的参数通过post 或者get的方式传递到商户后台,商户后台无法处理用户传入的参数,并生成商户订单。

    原因:在创建商户订单时,需要获取到用户的openid

    //①、获取用户openid
    $tools = new JsApiPay();
    $openId = $tools->GetOpenid();
        public function GetOpenid()
        {
            //通过code获得openid
            if (!isset($_GET['code'])){
                //触发微信返回code码
                $baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']);
                $url = $this->__CreateOauthUrlForCode($baseUrl);
                Header("Location: $url");
                exit();
            } else {
                //获取code码,以获取openid
                $code = $_GET['code'];
                $openid = $this->getOpenidFromMp($code);
                return $openid;
            }
        }

    但是在获取用户openid的过程中需要请求CODE,CODE请求函数如下:

    private function __CreateOauthUrlForCode($redirectUrl)
        {
            $urlObj["appid"] = WxPayConfig::APPID;
            $urlObj["redirect_uri"] = "$redirectUrl";
            $urlObj["response_type"] = "code";
            $urlObj["scope"] = "snsapi_base";
            $urlObj["state"] = "STATE"."#wechat_redirect";
            $bizString = $this->ToUrlParams($urlObj);
            return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString;
        }

    因此,在获取openid商户后台与微信系统进行多次交互,当再次回到生成商户订单页的时候,我们之前从h5页面通过$_GET或者$_POST方式获取的参数已经被清空,所以无法生成商户订单。(甚至报错500)

    解决办法:

    1.先将用户h5页面提交过来的参数保存到session中,然后再重定向到要生成商户订单的页面JSpay_redirect.php,例如:

    /* order_redirect.php */
    if(isset($_POST['order'])){
           //将所需要的订单id,金额等信息放在全局session中
    session_start();
    $_SESSION['premoney']=$_POST['premoney']; ... Header("Location: JSpay_redirect.php"); }

    2.然后在生成商户订单的页面中先获取openid,再获取session中的值,例如:

    //①、获取用户openid
    $tools = new JsApiPay();
    $openId = $tools->GetOpenid();
    
    session_start();
    $premoney=$_SESSION['premoney'];

    3.这样就可以获取到想要自定义支付订单的参数的值了,然后再调用统一下单接口。

    遇到问题:

    1、在微信web开发者工具中一直提示:

      

    原因未知,很蛋疼。(解决办法:直接无视,继续你华丽的脚步)

    2、在微信web开发者工具中,点击callpay()对应的按钮,调用微信内置的jsapi接口报错:

      

    然而在实际手机微信操作,却调用jsapi成功,且能支付、回调成功。原因是开发者工具bug(maybe)。

    感谢CSDN的GeeKLV,链接:

    http://blog.csdn.net/geeklx/article/details/51146151

  • 相关阅读:
    c#实现windows远程桌面连接程序
    基于.NET平台常用的框架整理
    c#无限循环线程如何正确退出
    c# 内存的具体表现- 通用类型系统 深拷贝 浅拷贝 函数传参
    coco2d-x convertToWorldSpace介绍
    Effective C++条款20:宁以pass-by-reference-to-const替换pass-by-value。Test code
    函数指针与指针函数返回值的区别
    游戏开发那些事
    lua 根据指定字符拆分table字符串(转载)
    实习和学习的双重压力
  • 原文地址:https://www.cnblogs.com/xuzhengzong/p/7838338.html
Copyright © 2011-2022 走看看