微信公众号开发给我设置了很多坑,每一个开发过微信的开发者,在面对微信的API文档时,都是崩溃的。微信支付的开发就更加崩溃,因为微信支付涉及到签名,其两次签名的设计,让人饱受折麽,为APP开发的同学们感叹。而这篇文章,主要来谈一下微信支付在HTML5页面(微信浏览器内部)内进行支付的开发过程。
微信服务号用户授权接口
首先要解决的是微信服务号用户授权的问题,授权过程主要是为了拿到用户的openid,或者拿到用户的昵称等更多信息。那么怎么来授权呢?
进入微信公众平台,在“开发-接口权限”中找到“网页授权-网页授权获取用户基本信息”,点击后面的“修改”,在弹出来的界面中,输入你允许在那个域名下进行授权。这个域名,必须与下面提到的redirect_uri中的域名对应,否则授权不了。
完成之后,我们就开始进入授权开发了。首先是获取授权要用的基本信息,包括:
AppID : 在“开发-基本配置”中获取AppSecret : 同上,但需要该公众号的管理员微信扫码后才能显示
第一步,获取code。
接下来,我们(用微信)访问这样一个网址:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
上面的蓝色字表示需要被替换。
APPID 替换为你上面拿到的AppIDREDIRECT_URI 替换为一个你上面填写的那个域名下的人和网页都可以,不过最好是可以访问的,因为这个地址将会在后面作为获取用户openid的页面。SCOPE 有两个值可以挑选snsapi_base和snsapi_userinfo,如果使用前一个,你不会看到授权按钮,但是,你也拿不到用户的昵称等信息,而后一个则一定要让用户点击授权按钮之后才能进行下一步,不过可以拿到用户的更多信息,同时,还可以拿到access token和refresh token。(用户的更多信息需要这里的access token去进一步操作。)
完成之后,你就可以安心等待结果,页面停止跳转后,我们看页面的URL地址。你可以发现,在页面的URL中,有一个code参数,它是拿到接下来的信息的关键。
第二步,凭code获取openid。
code是一个票据,可以用来获取用户openid和access token,我们先获取openid。
访问下面这个地址:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
上面的地址中蓝色部分同样需要替换。其中APPID你已经知道了,SECRET就是AppSecret,是在最开始的时候就让你拿到到那个。CODE则是上一步中拿到的那个。
注意:SECRET是绝密信息,你不可以把它给任何人看到,最好也不要像我刚才说的,直接用它来访问URL,最好的情况下,我们是写一个服务端脚本,通过curl来请求上面这个URL。
我们用PHP写一个函数来实现吧:
define('APPID','xxxxxx');
define('SECRET','xxxxxx');
$Code = $_GET['code'];
getCurl($url) { //初始化curl
$ch = curl_init(); //设置超时
curl_setopt($ch, CURLOP_TIMEOUT, Conf::CURL_TIMEOUT);
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE); //设置header
curl_setopt($ch, CURLOPT_HEADER, FALSE); //要求结果为字符串且输出到屏幕上
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //运行curl
$data = curl_exec($ch);
curl_close($ch); //返回结果
if($data) {
curl_close($ch);
return $data;
}
else {
$error = curl_errno($ch);
echo "curl出错,错误码:$error"."
";
echo "错误原因查询";
curl_close($ch);
return false;
}
}
$result =