ajax 获取微信openid 一直走error函数

夜雨Z1 2016-09-28 11:52:02
在弄一个微信端调用jssdk支付接口的功能,在用ajax获取接口必要的参数时总是走error,用的是tp框架,现在在ajax url路径直接 $this->ajaxReturn($openid,'JSON'); 但是还是走error函数 alert下XMLHttpRequest.status为0,而如果直接$this->ajaxReturn('hhhh'); 是可以正常走success函数的,说明js是没错的,很是郁闷,而且如果不用ajax 直接在微信点开url 是可以看到输出我的openid的,说明程序是没错的啊 但是一用ajax就出错了
大家看下代码 我把get_openid()函数整个都复制过来了

/**
* Jsapi调用H5支付
*/
public function jsapi(){
//自定义订单号
// $this->ajaxReturn('hhhh');
$openid = get_openid();
$this->ajaxReturn($openid,'JSON');


// 获取当前用户的OpenId
function get_openid() {
// $openid = session('openid_');
$isWeixinBrowser = isWeixinBrowser();
if ($isWeixinBrowser) {
$callback = GetCurUrl();
$openid = OAuthWeixin($callback);
// session('openid_', $openid);
}
if (empty($openid)) {
return '-1';
// exit ( 'openid获取失败error' );
}
return $openid;
}
// php获取当前访问的完整url地址
function GetCurUrl() {
$url = 'http://';
if (isset($_SERVER ['HTTPS']) && $_SERVER ['HTTPS'] == 'on') {
$url = 'https://';
}
if ($_SERVER ['SERVER_PORT'] != '80') {
$url .= $_SERVER ['HTTP_HOST'] . ':' . $_SERVER ['SERVER_PORT'] . $_SERVER ['REQUEST_URI'];
} else {
$url .= $_SERVER ['HTTP_HOST'] . $_SERVER ['REQUEST_URI'];
}
// 兼容后面的参数组装
if (stripos($url, '?') === false) {
$url .= '?t=' . time();
}
return $url;
}
// 判断是否是在微信浏览器里
function isWeixinBrowser($from = 0) {
if ((!$from && defined('IN_WEIXIN') && IN_WEIXIN) || isset($_GET ['is_stree']))
return true;

$agent = $_SERVER ['HTTP_USER_AGENT'];
if (!strpos($agent, "icroMessenger")) {
return false;
}
return true;
}


function OAuthWeixin($callback) { // echo '444';

$callback = urldecode($callback);

vendor('WxPayPubHelper.WxPayPubHelper');
$info = array(
'appid' => \WxPayConf_pub::APPID,
'secret' => \WxPayConf_pub::APPSECRET
);

// if (strpos($callback, '?') === false) {
// $callback .= '?';
// } else {
// $callback .= '&';
// }
F('url',$callback);
$param ['appid'] = $info ['appid'];
if (!isset($_GET ['getOpenId'])) {
$param ['redirect_uri'] = $callback . '/getOpenId/1';
$param ['response_type'] = 'code';
$param ['scope'] = 'snsapi_base';
$param ['state'] = 123;

$url = 'https://open.weixin.qq.com/connect/oauth2/authorize?' . http_build_query($param) . '#wechat_redirect';
F('get_code_url',$url);
redirect($url);
} else if ($_GET ['state']) {
$param ['secret'] = $info ['secret'];
$param ['code'] = I('code');
$param ['grant_type'] = 'authorization_code';

$url = 'https://api.weixin.qq.com/sns/oauth2/access_token?' . http_build_query($param);
$content = file_get_contents($url);
$content = json_decode($content, true);

F('openid',$content);
return $content ['openid'];
}

}


/**
* 微信支付
*/
function pay(price){
var url = "{:U('Wxpay/jsapi','','')}";
var price = 0.01;
if (!price) {
price = 0.01;
}
//alert(url+"--"+"price="+price+"&orderid="+orderid);
$.ajax({
url : url,
type : "post",
dataType : "json",
data : {price:price},
success : function(data){
alert(data);
/* var json_str = data;
var json_obj = JSON.parse(json_str);
callpay(json_obj,params,payokFunc,paycancelFunc,payfailFunc); */
},
error : function(XMLHttpRequest, textStatus, errorThrown){
alert('error');
alert(XMLHttpRequest.status);
alert(XMLHttpRequest.readyState);
}
});
}
...全文
767 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruffiantoo 2017-02-16
  • 打赏
  • 举报
回复
楼主解决了吗,我这也有这问题
工程师老罗 2017-02-15
  • 打赏
  • 举报
回复
楼主解决问题没有,我也遇到类似的问题,用ajax传openid死活传不过去
Earthg 2017-01-24
  • 打赏
  • 举报
回复
跨越问题。文档例子中获取openid的机制是:拼装入口请求URL,然后用header跳转才能取到code。这里会header到外网,如果是AJAX,会报跨越错误。要解决跨越问题
夜雨Z1 2016-09-30
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
注释掉 dataType : "json", alert(data); 就可看到实际返回的是什么
问下大神,url 进去会跳转到另外一个域名上获取参数再返回到这个url输出,那这样的url可以使用ajax吗?
xuzuning 2016-09-30
  • 打赏
  • 举报
回复
如果是经过 ajax 跳转的,不可以
夜雨Z1 2016-09-29
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
注释掉 dataType : "json", alert(data); 就可看到实际返回的是什么
注释掉了但还是走error·············
xuzuning 2016-09-29
  • 打赏
  • 举报
回复
注释掉 dataType : "json", alert(data); 就可看到实际返回的是什么

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧