章节课时

8.1,配置线上环境
配置开发线上环境,配置SSL证书等。
8.2,微信支付 - 调起微信支付
完成调起微信支付功能。
8.3,微信支付 - 异步通知
微信支付异步通知逻辑讲解,功能开发。
8.4,使用封装类完成微信开发
完成微信支付功能;支付记录表设计;支付成功后逻辑处理。

主要内容

1,配置开发生产环境
2,配置SLL证书
4,微信支付微信商家配置
5,完成微信支付流程

JSAPI支付

JSAPI支付主要是在微信内,通过微信提供的一个JS方法调起支付弹窗:
0.jpg
注意一定是在微信内打开的页面,在其它浏览器中,这个方法是无效的。
使用这个方法需要一些参数,这些参数是通过另外一个接口 统一下单 接口获取的:

  1. WeixinJSBridge.invoke('getBrandWCPayRequest', {
  2. appId: "wx11111111111", //公众号ID,由商户传入
  3. timeStamp: "1395712654", //时间戳,自1970年以来的秒数
  4. nonceStr: "e61463f8efa94090b1f366cccfbbb444", //随机串
  5. package: "prepay_id=u802345jgfjsdfgsdg888",
  6. signType: "MD5", //微信签名方式
  7. paySign: "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名
  8. }, function (res) {
  9. if (res.err_msg == "get_brand_wcpay_request:ok") {
  10. // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
  11. weui.alert('购买成功', function() {
  12. window.location.reload();
  13. });
  14. }
  15. });

这张图是PHP后端返回给前端的所需数据,也是调起支付弹窗的JS方法所需的数据:
image.png
当一系列支付操作进行完成后,微信会通过异步请求的方式,请求我们提供的一个URL接口,来告知我们微信支付成功的结果。
微信文档介绍:支付完成后,微信会把相关支付结果及用户信息通过数据流的形式发送给商户,商户需要接收处理,并按文档规范返回应答。

那 JSAPI支付 的整个流程可以大致总结为:
1,通过 统一下单 接口获取一些需要的值,并返回给前端。
2,前端拿到所需值后,通过微信提供的一个 JS 方法调起支付弹窗,并进行支付操作。
3,微信通过 异步请求 的方式告知我们支付结果。
4,支付完成。

证书导出结果截图

image.png

教程资料

微信配置相关资料:https://www.yuque.com/baozoudexigua/wm5gvp/nagc88
微信支付开发者文档:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay6_0.shtml
JSAPI调起支付API:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
统一下单:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
支付结果通知:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7&index=8
微信支付V2文档:https://pay.weixin.qq.com/wiki/doc/api/index.html
Laravel CSRF 保护:https://learnku.com/docs/laravel/8.5/csrf/10370
CSRF攻击与防御:https://www.yuque.com/baozoudexigua/pm8guc/uzbulu

知识要点

JSAPI支付的主要流程

1,使用统一下单接口获取

Nginx Vhost 域名配置演示

server {
  listen 80;
  listen 443 ssl http2;

  ssl_certificate /data/ssl/mh1.linghao100.com/mh1.linghao100.com.crt;
  ssl_certificate_key /data/ssl/mh1.linghao100.com/mh1.linghao100.com.key;
  ssl_session_timeout 5m;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  # 加密方式copy即可
  ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
  ssl_session_cache builtin:1000 shared:SSL:10m;

  # http强制跳转https
  if ($ssl_protocol = "") { return 301 https://$host$request_uri; }

  server_name i.linghao100.com;
  access_log /data/wwwlogs/mh1.linghao100.com_nginx.log combined;
  index index.html index.htm index.php;
  root /data/wwwroot/mh1.linghao100.com/public;

  include /usr/local/nginx/conf/rewrite/laravel.conf;
  #error_page 404 /404.html;
  #error_page 502 /502.html;

  location ~ [^/]\.php(/|$) {
    #fastcgi_pass remote_php_ip:9000;
    fastcgi_pass unix:/dev/shm/php-cgi.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
  }

  location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
    expires 30d;
    access_log off;
  }
  location ~ .*\.(js|css)?$ {
    expires 7d;
    access_log off;
  }
  location ~ /(\.user\.ini|\.ht|\.git|\.svn|\.project|LICENSE|README\.md) {
    deny all;
  }
  location /.well-known {
    allow all;
  }
}

php://input

是个可以访问请求的原始数据的只读流。
当请求方式是 post,并且Content-Type不等于 multipart/form-data 时,可以使用 php://input 来获取原始请求的数据。
https://www.php.net/manual/zh/wrappers.php.php