菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
95
0

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

原创
05/13 14:22
阅读数 59155

本文转载至: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

 

发表评论

0/200
95 点赞
0 评论
收藏
为你推荐 换一批