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

摘要:
微信支付的V3版本没有paySignKey参数。)写在前面:V3WxpayPubHelper在个人测试中是有效的,但最新版本还没有经过测试,所以理论上是一样的。微信支付api真的有很多陷阱。今天,我们一直在讨论微信支付jsapi参数无法通过get或post获取的问题!!用户点击开始支付之前的微信网络支付流程:问题:用户h5页面上输入的参数通过post或get传输到商家后台。商家后台无法处理用户传入的参数并生成商家订单。遇到的问题:1.在微信网络开发工具中,总是有一个提示:原因未知,这很痛苦。

本文转载至: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 = newJsApiPay();
$openId = $tools->GetOpenid();
    public functionGetOpenid()
    {
        //通过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 = newJsApiPay();
$openId = $tools->GetOpenid();
session_start();
$premoney=$_SESSION['premoney'];

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

遇到问题:

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

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

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

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

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

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

感谢CSDN的GeeKLV,链接:

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

免责声明:文章转载自《转载【微信支付】jsapi支付之传参问题(使用微信官方SDK之PHP版本) V3之WxpayPubHelper 亲测有效,V3WxpayAPI_php_v3.zip版未测试,理论上也是一样的。》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇clang: error: linker command failed with exit code 1Qt 中文乱码解决方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Oracle 异常处理汇总

Oracle 异常处理汇总 1、plsql无法连接 安装oracle,中间录入密码,用户是:sys,pass: 录入的密码。 连接数据库,建议创建新的用户,最好别直接用sys 安装完毕,则需要配置Net Configration Assistant,才能通过pl/sql连接 确保服务监听服务已经启动 2、遇到ORACLE错误12514 解决方案: 1)...

(原创)LAMP搭建之一:图解如何安装并检查LAMP

LAMP搭建之一:图解如何安装并检查LAMP 第一步:安装Linux(RedHat5) 第二步:rpm -qa httpd(查看apache是否安装)     rpm -qa php(查看php是否安装)     rpm -qa mysql(查看mysql是否安装)     如果没有安装,用rpm -ivh 安装。 第三步:service httpd sta...

SuperSocket源码解析之会话生命周期

一 基本概念    会话(Session)是客户端与服务器进行通信的基本单元,也是一个Socket的封装,在http协议中也有Session机制,其主要作用封装一个通信单元socket,负责服务器与客户端消息发送与接收,会话之间相互独立互不干扰且拥有唯一SessionId标识,维护着客户与服务器通信的生命周期。 二 SocketSession Socket...

hprose for php

1.客户端和服务器简单DEMO 通过工厂方法 create 创建客户端 $client = HproseClient::create($uriList = null[, $async = true]); create 方法与构造器函数的参数一样,返回结果也一样。但是第一个参数 $uriList 不能被省略。 使用 create 方法更加方便,因此,除非...

(PHP)redis String(字符串)操作

/** * * String操作 * 字符串操作 * */ //设置键值:成功返回true,否则返回false,键值不存在则新建,否则覆盖 $redis->set('string', 'hello world!'); //从左往右第五个字符开始替换为另一指定字符串,成功返回替换后新字符串的长度。 $redis->setRan...

ASP.net Application及Session 的start end 方法总结

经过几天的摸索,试验,今天终于可以将Application及Session对象的Start和End方法做下总结了. Application_start: 第一个访问网站的用户会触发该方法. 通常会在该方法里定义一些系统变量,如聊天室的在线总人数统计,历史访问人数统计的初始化等等均可在这里定义. Application_end:网站关闭,或重启时,会触发该...