微信HTML5网页支付PHP + JS API总结

广告位招租
扫码页面底部二维码联系

微信公众号开发给我设置了很多坑,每一个开未经授权,禁止复制转载。【本文首发于唐霜的博客】发过微信的开发者,在面对微信的API文档【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net时,都是崩溃的。微信支付的开发就更加崩溃【本文受版权保护】【版权所有,侵权必究】,因为微信支付涉及到签名,其两次签名的设本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】计,让人饱受折麽,为APP开发的同学们感原创内容,盗版必究。转载请注明出处:www.tangshuang.net叹。而这篇文章,主要来谈一下微信支付在H【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。TML5页面(微信浏览器内部)内进行支付【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。的开发过程。

本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。

微信服务号用户授权接口著作权归作者所有,禁止商业用途转载。

【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net原创内容,盗版必究。【版权所有,侵权必究】

首先要解决的是微信服务号用户授权的问题,未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】授权过程主要是为了拿到用户的openid【本文首发于唐霜的博客】【作者:唐霜】,或者拿到用户的昵称等更多信息。那么怎么【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】来授权呢?

本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】【版权所有,侵权必究】【原创内容,转载请注明出处】未经授权,禁止复制转载。

进入微信公众平台,在“开发-接口权限”中著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。找到“网页授权-网页授权获取用户基本信息本文作者:唐霜,转载请注明出处。”,点击后面的“修改”,在弹出来的界面中【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。,输入你允许在那个域名下进行授权。这个域【本文首发于唐霜的博客】【原创内容,转载请注明出处】名,必须与下面提到的redirect_u【本文首发于唐霜的博客】原创内容,盗版必究。ri中的域名对应,否则授权不了。

转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】

完成之后,我们就开始进入授权开发了。首先【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。是获取授权要用的基本信息,包括:

本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】【未经授权禁止转载】

AppID : 在“开发-基本配置”中获未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。取AppSecret : 同上,但需要该著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net公众号的管理员微信扫码后才能显示

【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net【转载请注明来源】本文版权归作者所有,未经授权不得转载。
原创内容,盗版必究。转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【作者:唐霜】【作者:唐霜】

第一步,获取code。【版权所有,侵权必究】

【作者:唐霜】著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】【版权所有,侵权必究】

接下来,我们(用微信)访问这样一个网址:

【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。【作者:唐霜】【转载请注明来源】本文作者:唐霜,转载请注明出处。
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

上面的蓝色字表示需要被替换。【版权所有,侵权必究】

【未经授权禁止转载】【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。

APPID 替换为你上面拿到的AppID未经授权,禁止复制转载。【原创内容,转载请注明出处】REDIRECT_URI 替换为一个你上未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。面填写的那个域名下的人和网页都可以,不过本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】最好是可以访问的,因为这个地址将会在后面本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】作为获取用户openid的页面。SCOP本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。E 有两个值可以挑选snsapi_bas【关注微信公众号:wwwtangshuangnet】【作者:唐霜】e和snsapi_userinfo,如果本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。使用前一个,你不会看到授权按钮,但是,你【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】也拿不到用户的昵称等信息,而后一个则一定【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。要让用户点击授权按钮之后才能进行下一步,【原创不易,请尊重版权】【作者:唐霜】不过可以拿到用户的更多信息,同时,还可以本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】拿到access token和refre著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】sh token。(用户的更多信息需要这【未经授权禁止转载】原创内容,盗版必究。里的access token去进一步操作【作者:唐霜】本文版权归作者所有,未经授权不得转载。。)

【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】【原创不易,请尊重版权】【未经授权禁止转载】
【作者:唐霜】【版权所有,侵权必究】【未经授权禁止转载】

完成之后,你就可以安心等待结果,页面停止本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net跳转后,我们看页面的URL地址。你可以发本文作者:唐霜,转载请注明出处。【未经授权禁止转载】现,在页面的URL中,有一个code参数本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。,它是拿到接下来的信息的关键。

【本文首发于唐霜的博客】【本文受版权保护】本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。

第二步,凭code获取openid。未经授权,禁止复制转载。

【本文受版权保护】【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net

code是一个票据,可以用来获取用户op本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.netenid和access token,我们未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】先获取openid。

本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】

访问下面这个地址:【未经授权禁止转载】

【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net原创内容,盗版必究。原创内容,盗版必究。
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

上面的地址中蓝色部分同样需要替换。其中A【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.netPPID你已经知道了,SECRET就是A【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.netppSecret,是在最开始的时候就让你转载请注明出处:www.tangshuang.net原创内容,盗版必究。拿到到那个。CODE则是上一步中拿到的那原创内容,盗版必究。【原创不易,请尊重版权】个。

转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net

注意:SECRET是绝密信息,你不可以把【作者:唐霜】著作权归作者所有,禁止商业用途转载。它给任何人看到,最好也不要像我刚才说的,【转载请注明来源】未经授权,禁止复制转载。直接用它来访问URL,最好的情况下,我们本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】是写一个服务端脚本,通过curl来请求上【作者:唐霜】本文作者:唐霜,转载请注明出处。面这个URL。

【版权所有】唐霜 www.tangshuang.net未经授权,禁止复制转载。【作者:唐霜】转载请注明出处:www.tangshuang.net【作者:唐霜】

我们用PHP写一个函数来实现吧:【作者:唐霜】

著作权归作者所有,禁止商业用途转载。【作者:唐霜】著作权归作者所有,禁止商业用途转载。
<?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"."<br>";
    echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a></br>";
    curl_close($ch);
    return false;
  }
}

$result = getCurl('https://api.weixin.qq.com/sns/oauth2/access_token?appid='.APPID.'&secret='.SECRET.'&code='.$Code.'&grant_type=authorization_code');
echo $result;

然后用getCurl()函数来请求上面那【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。个URL,把抓取到的结果直接显示在你的页【原创不易,请尊重版权】【未经授权禁止转载】面上,这样你就可以看到结果了。把上面这段本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.netPHP保存下来,修改对应的信息之后,上传著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】到你的服务器上面,最好就是我上面说的那个【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】redirect_uri,授权完跳转回的【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】那个页面。这样正好接收到code。

【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】

这样,你就拿到了一个用户的openid。【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。如果可以的话,把它保存在你的服务器上,和【作者:唐霜】著作权归作者所有,禁止商业用途转载。某个用户的ID绑定起来,下次再也不用通过【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】code再去拿openid了。

【版权所有,侵权必究】原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net

第三步,获取access token。【版权所有】唐霜 www.tangshuang.net

著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net【作者:唐霜】

重新回到第一步,把未经授权,禁止复制转载。SCOPE【版权所有】唐霜 www.tangshuang.net替换为snsapi_userinfo。然著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。后重新执行第一步,第二步。这时,你可以拿【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】到openid的同时,拿到access 转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】token,以及refresh toke【本文受版权保护】【转载请注明来源】n。refresh token是用来刷新本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】授权使用的,下一次你想拿openid和a【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】ccess token,可以不用code【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。,直接用refresh token就可以本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。了,下面会介绍。

著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。本文作者:唐霜,转载请注明出处。

第四步,获取用户昵称和头像。【版权所有,侵权必究】

本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】

访问这个网址:未经授权,禁止复制转载。

【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】转载请注明出处:www.tangshuang.net
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

上面蓝色的字,是在第三步中才能拿到的信息【本文首发于唐霜的博客】【关注微信公众号:wwwtangshuangnet】。替换就好了。

未经授权,禁止复制转载。【本文首发于唐霜的博客】【本文受版权保护】

注意:和SECRET一样,ACCESS_【未经授权禁止转载】【转载请注明来源】TOKEN也是绝密信息,不允许泄露,所以原创内容,盗版必究。【版权所有,侵权必究】,我们还是不能在浏览器中请求这个URL,本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】接着在上面那个PHP文件中这么写:

未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】
$data = json_decode($result,true);
$AccessToken = $data['access_token'];
$OpenId = $data['openid'];
$user_info = getCurl('https://api.weixin.qq.com/sns/userinfo?access_token='.$AccessToken.'&openid='.$OpenId.'&lang=zh_CN');
echo $user_info;

这样,我们又可以看到抓取到到用户信息了。未经授权,禁止复制转载。未经授权,禁止复制转载。赶紧把这个用户的各种信息记录到你的数据库著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】里面,和原来的用户绑定在一起吧。

【关注微信公众号:wwwtangshuangnet】【作者:唐霜】【作者:唐霜】【本文受版权保护】

第五步,刷新授权。未经授权,禁止复制转载。

著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。原创内容,盗版必究。

接下来就看refresh token怎么本文作者:唐霜,转载请注明出处。【未经授权禁止转载】用了。在从第1步到第3步到过程中,我们需【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。要界面到跳转,用户的授权等动作。但是,如原创内容,盗版必究。转载请注明出处:www.tangshuang.net果你有了refresh token,这个著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net过程就不需要了,直接到第3步。

【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】【本文受版权保护】【原创不易,请尊重版权】

访问下面这个网址:【关注微信公众号:wwwtangshuangnet】

未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

你可以发现,这个接口只需要你的APPID【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net和REFRESH_TOKEN。如果你有r【本文受版权保护】【版权所有,侵权必究】efresh token的话,直接通过这著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。个接口,就可以拿到第3步的结果,取决于你【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。最开始的时候得到该refresh tok本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】en时传入的SCOPE值必须是snsap转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】i_userinfo。

转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】【未经授权禁止转载】未经授权,禁止复制转载。

为什么要刷新授权呢?因为你前面拿到的那个【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】access token只有7200秒的本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。有效期,如果过了这个有效期,你就拿不到用【本文受版权保护】本文版权归作者所有,未经授权不得转载。户的个人信息咯。但是再刷新一下acces【转载请注明来源】本文作者:唐霜,转载请注明出处。s token,就可以拿到了,用户更新了【关注微信公众号:wwwtangshuangnet】【本文受版权保护】头像,你也可以把他的头像更新过来。

【作者:唐霜】【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。

通过JS API调起微信支付本文作者:唐霜,转载请注明出处。

【版权所有,侵权必究】【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net

在拿到用户的openid之后,我们接下来【原创不易,请尊重版权】【原创内容,转载请注明出处】就要考虑支付的问题了。当用户准备支付的时【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】候,你怎么样才能调起微信进行支付呢?要用转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。JS API调起微信,要满足很多条件,这【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。些条件都比较复杂,导致我们经常在这个过程转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。中出现混乱。

【原创内容,转载请注明出处】【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】

开通公众号微信支付功能【访问 www.tangshuang.net 获取更多精彩内容】

【作者:唐霜】【版权所有】唐霜 www.tangshuang.net【本文受版权保护】【作者:唐霜】原创内容,盗版必究。

在服务号后台开通微信支付功能,需要进行商【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】户验证,提交各种材料。商户认证完之后,设【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】置“微信支付-开发配置”选项中的支付授权【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。目录。什么是支付授权目录呢?也就是调起微【作者:唐霜】本文作者:唐霜,转载请注明出处。信支付的访问URL所在的目录,比如你打算本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。在yourdomain/pay/weix未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.netin.html进行微信支付,在这个页面中【转载请注明来源】【原创不易,请尊重版权】有JS代码来呼出微信支付,那么在填写时,【转载请注明来源】未经授权,禁止复制转载。就要填写yourdomain/pay/,转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】末尾要以/结尾。

本文作者:唐霜,转载请注明出处。【转载请注明来源】【本文受版权保护】【转载请注明来源】原创内容,盗版必究。

当然,如果你打算只进行测试,可以在下方填【本文受版权保护】【版权所有】唐霜 www.tangshuang.net写测试目录,规则和上面的授权目录相同,但原创内容,盗版必究。本文作者:唐霜,转载请注明出处。是测试目录填写之后,必须填写白名单,也就【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。是用于测试的用户微信id号。

【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net【作者:唐霜】

如果你在非该目录下的页面中使用JS调起微【版权所有,侵权必究】原创内容,盗版必究。信支付,那么微信会提示错误。

【版权所有,侵权必究】【作者:唐霜】未经授权,禁止复制转载。

获取商户信息【版权所有】唐霜 www.tangshuang.net

未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。

商户信息需要通过上一步中完成商户认证时,【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net邮件中收到的商户登录信息登录到商户平台获原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net取。微信支付其实和微信公众号是两块业务,【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net在微信公众平台后台的微信支付功能,其实是【关注微信公众号:wwwtangshuangnet】【本文受版权保护】调用了微信支付的接口进行的操作,原则上,本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】在商户平台(pay.weixin.qq.【未经授权禁止转载】【原创内容,转载请注明出处】com)可以完成和支付相关的所有操作,而【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】在公众平台完成的,主要是依托公众号的操作转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】

著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。

这里有一个衍生知识,如果你打算申请APP原创内容,盗版必究。【本文首发于唐霜的博客】微信支付,那么微信公众号的微信支付是不可本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。用的,你需要到微信开放平台(open.w【版权所有,侵权必究】【作者:唐霜】eixin.qq.com)去申请一个账号原创内容,盗版必究。【原创不易,请尊重版权】,然后完成商户认证,完成认证时,会得到另本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】外一个商户平台(pay.weixin.q【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】q.com)账号,这个账号将绑定到微信开未经授权,禁止复制转载。【未经授权禁止转载】放平台的账号,而前面一个商户账号绑定的是【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。微信公众平台的账号。所以,最终你应该明白【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】:微信支付、微信公众平台、微信开放平台,【版权所有,侵权必究】【原创不易,请尊重版权】三者是相同级别的应用,没有谁属于谁的关系【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。,但是他们之间又有相互调用的联系,微信开转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。放平台在开发方面又更强过微信公众号,例如本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。在开放平台可以完成APP和网页微信支付的本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。集成,但是如果仅仅只有开放平台账号,则相【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】当于没有公众号,又少了公众号的开发环节。本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。所以,如果你两个平台都用的话,就必须要交【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。两个300进行认证。

【原创内容,转载请注明出处】【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net

登录商户平台之后,你可以拿到微信支付需要未经授权,禁止复制转载。原创内容,盗版必究。的资料:

著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】

machid 商户ID号key 商户平台转载请注明出处:www.tangshuang.net【作者:唐霜】开发密钥cert.pem SSL证书文件未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。key.pem SSL证书文件

【本文首发于唐霜的博客】原创内容,盗版必究。【转载请注明来源】【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】
著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net

有了这个信息之后,才能进入后面的开发。【未经授权禁止转载】

本文版权归作者所有,未经授权不得转载。【转载请注明来源】转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】

创建预支付信息著作权归作者所有,禁止商业用途转载。

【版权所有,侵权必究】【本文受版权保护】【版权所有】唐霜 www.tangshuang.net

微信支付的逻辑是,先通过我们自己的服务器著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】向微信支付服务器申请一个预支付订单号,在【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net支付时,得根据这个预支付订单号进行支付,本文作者:唐霜,转载请注明出处。【本文受版权保护】当支付完成之后,这个预支付订单就变成正式未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net订单了。

著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】【原创不易,请尊重版权】

所以,无论是app还是网页端,都需要先在【未经授权禁止转载】未经授权,禁止复制转载。你的服务器上进行这一步操作,以获得预支付【版权所有,侵权必究】【转载请注明来源】订单信息。

原创内容,盗版必究。【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。

怎么创建预支付信息呢?使用微信提供的【原创不易,请尊重版权】SDK【原创内容,转载请注明出处】。微信的SDK也很混乱,这里还有一个【未经授权禁止转载】SDK(2)【本文受版权保护】,前面一个SDK是从商户平台文档中找到的【转载请注明来源】本文版权归作者所有,未经授权不得转载。,而SDK2则是在微信公众平台后台点击权【转载请注明来源】原创内容,盗版必究。限接口的微信支付链接进入找到的。从简洁度本文版权归作者所有,未经授权不得转载。【本文受版权保护】来讲,我们使用SDK2更方便,因此我这里转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。选择了SDK2来进行讲解。我们下面用PH【作者:唐霜】【关注微信公众号:wwwtangshuangnet】P来做一个演示。

【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。

下载PHP SDK2,解压到本地,可以看未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net到有多个目录,在演示中不断找到WxPay著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.netPubHelper和demo目录。dem【原创不易,请尊重版权】【作者:唐霜】o目录中有一个js_api_call.p本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】hp,打开来阅读代码。在了解所有的工作原本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】理之后,我们自己来写一个自己的SDK,把本文作者:唐霜,转载请注明出处。【本文受版权保护】授权也囊括进来。

本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】

第1步,配置。【版权所有,侵权必究】

未经授权,禁止复制转载。【本文受版权保护】著作权归作者所有,禁止商业用途转载。

创建一个Conf.php文件,内容如下:

未经授权,禁止复制转载。【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。
 <?php

namespace WeiXin;

class Conf {
    const APPID = '你的公众号APPID';
    const MCHID = '你的商户ID';
    const KEY = '你的商户开发密钥';
    const APPSECRET = '你的公众号密钥';
    //证书路径,注意应该填写绝对路径
    const SSLCERT_PATH = '/你的路径/cacert/cert.pem';
    const SSLKEY_PATH = '/你的路径/cacert/key.pem';

    const CURL_TIMEOUT = 30;
}

上面就是配置文件的内容,根据你的情况修改未经授权,禁止复制转载。未经授权,禁止复制转载。为你自己的开发信息。

转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。

第2步,创建公共类。【版权所有,侵权必究】

【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】

创建一个公共类,用来被继承,这个公共类里【未经授权禁止转载】【原创不易,请尊重版权】面包含基本的curl操作、时间戳、数据类【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】型等方法,你可以自己再继续扩展。

本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】【原创不易,请尊重版权】【访问 www.tangshuang.net 获取更多精彩内容】

创建文件Common.php,创建一个C著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。ommon类来作为公共类。

【作者:唐霜】未经授权,禁止复制转载。原创内容,盗版必究。

这个公共类包含了三类方法,一类是字符串处【转载请注明来源】【未经授权禁止转载】理和算法,一类是array和xml之间的【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。转换,一类是curl操作。

本文作者:唐霜,转载请注明出处。【作者:唐霜】【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net

第3步,创建授权类。【访问 www.tangshuang.net 获取更多精彩内容】

【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。

虽然前面我们已经讲过了授权怎么做,但是这原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。里我们仍然将它集成到我们自己的SDK中。

【转载请注明来源】著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。未经授权,禁止复制转载。原创内容,盗版必究。

创建一个Oauth类来实现授权。本文作者:唐霜,转载请注明出处。

【本文受版权保护】【本文首发于唐霜的博客】原创内容,盗版必究。

你可以看到,我们使用Common进行继承著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。,使用了Common类中的一些方法。

【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】【未经授权禁止转载】

第4步,创建微信支付类。【版权所有】唐霜 www.tangshuang.net

本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】【转载请注明来源】

微信支付类我们要分解开详细讲,我会在文末原创内容,盗版必究。【原创内容,转载请注明出处】把SDK上传,这样你可以下载SDK自己去本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。研究。

【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net【转载请注明来源】【原创内容,转载请注明出处】

由于本文讲的是HTML5页面用JS调起微原创内容,盗版必究。本文作者:唐霜,转载请注明出处。信支付,所以我这里也只讲解这个部分,其他【转载请注明来源】【版权所有,侵权必究】的部分,你可以慢慢阅读SDK中的源码。

【本文首发于唐霜的博客】【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】

首先我们列出统一下单的SDK【本文首发于唐霜的博客】

本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。
/** * 统一支付接口类 */
class UnifiedOrder extends WxpayClient {
    function __construct() {
        //设置接口链接
        $this->url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        //设置curl超时时间
        $this->curl_timeout = Conf::CURL_TIMEOUT;
    }

    /**
     * 生成接口参数xml
     */
    function createXml() {
        try {
            //检测必填参数
            if($this->parameters["out_trade_no"] == null) {
                throw new RuntimeException("缺少统一支付接口必填参数out_trade_no!"."<br>");
            }
            elseif($this->parameters["body"] == null) {
                throw new RuntimeException("缺少统一支付接口必填参数body!"."<br>");
            }
            elseif ($this->parameters["total_fee"] == null ) {
                throw new RuntimeException("缺少统一支付接口必填参数total_fee!"."<br>");
            }
            elseif ($this->parameters["notify_url"] == null) {
                throw new RuntimeException("缺少统一支付接口必填参数notify_url!"."<br>");
            }
            elseif ($this->parameters["trade_type"] == null) {
                throw new RuntimeException("缺少统一支付接口必填参数trade_type!"."<br>");
            }
            elseif ($this->parameters["trade_type"] == "JSAPI" && $this->parameters["openid"] == NULL){
                throw new RuntimeException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!"."<br>");
            }
            $this->parameters["appid"] = Conf::APPID;//公众账号ID
            $this->parameters["mch_id"] = Conf::MCHID;//商户号
            $this->parameters["spbill_create_ip"] = $_SERVER['REMOTE_ADDR'];//终端ip
            $this->parameters["nonce_str"] = $this->createNoncestr();//随机字符串
            $this->parameters["sign"] = $this->createSign($this->parameters);//签名
            return  $this->arrayToXml($this->parameters);
        }
        catch (RuntimeException $e) {
            die($e->errorMessage());
        }
    }

    /**
     * 获取prepay_id
     */
    function getPrepayId() {
        $this->postXml();
        $this->result = $this->xmlToArray($this->response);
        $prepay_id = $this->result["prepay_id"];
        return $prepay_id;
    }
}

接下来看下JS SDK的内容未经授权,禁止复制转载。

【未经授权禁止转载】【版权所有,侵权必究】【作者:唐霜】【原创不易,请尊重版权】
/**
 * JSAPI支付——H5网页端调起支付接口
 */
class JsApi extends Common {
    var $parameters;//jsapi参数,格式为json
    var $prepay_id;//使用统一支付接口得到的预支付id
    var $curl_timeout;//curl超时时间

    function __construct() {
        //设置curl超时时间
        $this->curl_timeout = Conf::CURL_TIMEOUT;
    }

    /**
     *
     作用:设置prepay_id
     */
    function setPrepayId($prepayId) {
        $this->prepay_id = $prepayId;
    }

    /**
     *
     作用:设置jsapi的参数
     */
    public function getParameters() {
        $jsApiObj["appId"] = Conf::APPID;
        $timeStamp = time();
        $jsApiObj["timeStamp"] = "$timeStamp";
        $jsApiObj["nonceStr"] = $this->createNoncestr();
        $jsApiObj["package"] = "prepay_id=$this->prepay_id";
        $jsApiObj["signType"] = "MD5";
        $jsApiObj["paySign"] = $this->createSign($jsApiObj);
        $this->parameters = json_encode($jsApiObj);

        return $this->parameters;
    }
}

SDK在这里下载。转载请注明出处:www.tangshuang.net

本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net【作者:唐霜】【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】

第5步,在页面中生成支付代码,调起支付。

【原创不易,请尊重版权】未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net

SDK已经有了,我们来看下在页面中,究竟【本文首发于唐霜的博客】未经授权,禁止复制转载。应该怎么用呢?

【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】【原创内容,转载请注明出处】
<?php

// 引入SDK的文件:
require '....省略了....';

$Oauth = new WeiXin\Oauth();
// 如果没有openid的情况下,要用户先去授权,页面要跳转一次,当然,这里不需要获取用户的昵称等信息
// 最好是你可以将用户的openid保存到数据,根据当前登录用户的信息直接拿到openid,这样就不需要授权了
if(!isset($_GET['code'])) {
   $url = $Oauth->createCodeURL('回调地址,填写当前页面的URL');
   header("Location: $url");
   exit;
}

// 接下来是通过JS SDK获取预支付信息
// 先获得openid
$code = $_GET['code'];
$Oauth->setCode($code);
$openid = $Oauth->getOpenId();

// 统一下单SDK
$UnifiedOrder = new \WeiXin\UnifiedOrder();
$UnifiedOrder->setParameter("openid",$openid);
$UnifiedOrder->setParameter("body",'订单信息');
$UnifiedOrder->setParameter("out_trade_no",'订单号,指在你自己的系统中的订单号'); 
$UnifiedOrder->setParameter("total_fee",20.99 * 100);//总金额,微信支付是按分为单位,因此这里乘以100
$UnifiedOrder->setParameter("notify_url",'回调地址,下一步中会有讲解');
$UnifiedOrder->setParameter("trade_type","JSAPI");
$prepay_id = $UnifiedOrder->getPrepayId();

$JsApi = new \WeiXin\JsApi();
$JsApi->setPrepayId($prepay_id);
$result = $JsApi->getParameters(); // 这样就拿到了用于调起微信支付的预支付订单信息,接下来就是JS代码了

?>

...

<script>
function jsApiCall() {
    WeixinJSBridge.invoke(
        'getBrandWCPayRequest',
        <?php echo $result; ?>,
        // 直接把上面得到的结果放在这里
        function(res){
          // 这个是回调函数,表示用户调起微信支付后的一些动作,不过一般情况下,这个回调函数的执行时间难以把握,你只能在这个函数中确定用户已经开始执行微信支付了,到底有没有支付成功是很难把握的
        }
    );
}

function callpay(){
    if (typeof WeixinJSBridge == "undefined"){
        if( document.addEventListener ) {
            document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
        }
        else if (document.attachEvent) {
            document.attachEvent('WeixinJSBridgeReady', jsApiCall);
            document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
        }
    }
    else {
        jsApiCall();
    }
}

window.onload = callpay(); // 网页加载完之后,立即调起微信支付,现在可以去支付了。
</script>

回调【原创不易,请尊重版权】

本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。【原创内容,转载请注明出处】

这里的回调和上面javascript代码【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。中的回调函数是两码事,这里的回调是指你支【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net付完后,微信服务器会通过你在前面统一下单【未经授权禁止转载】【原创不易,请尊重版权】处传入的URL,发送一些支付数据给你的服【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。务器,你的服务器收到这个数据后,对订单进原创内容,盗版必究。原创内容,盗版必究。行判断和处理,如果微信告知你用户已经付款【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】成功了,就应该更新订单的状态为已支付成功【版权所有,侵权必究】未经授权,禁止复制转载。

原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】

2016-04-16 52506

为价值买单,打赏一杯咖啡

本文价值525.06RMB
已有5条评论
  1. qgqgqg 2017-11-11 10:02

    授权完,通过code获得的结果中,同时包含了openid和access_token(user token),还有一个refresh_token,什么意思?

    • 否子戈 2017-11-11 10:07

      Access token有效期比较短,refresh 有效期比较长,可以通过refresh token直接获得一个新的access token而无需用户登陆授权

  2. […] 其它的就真的是一模一样的。授权完,通过code获得的结果中,同时包含了openid和access_token(user token),还有一个refresh_token,这个我们不讲,请阅读前面一篇《微信服务号用户授权接口》。 […]

  3. 龙斯超 2017-04-04 11:17

    想下载一个好的微信支付demo;官方的有BUF

    • 否子戈 2017-04-04 14:01

      这是多年前的文章了,可能api已经不适用