热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP:微信小程序微信支付服务端集成实例详解

这篇文章主要介绍了微信小程序微信支付服务端集成实例详解及源码下载的相关资料,需要的朋友可以参考下
微信小程序 微信支付服务端集

理论上集成微信支付的全部工作可以在小程序端完成,因为小程序js有访问网络的能力,但是为了安全,不暴露敏感key,而且可以使用官方提供的现成php demo更省力,于是在服务端完成签名与发起请求,小程序端只做一个wx.requestPayment(OBJECT)接口的对接。

整体集成过程与JSAPI、APP类似,先统一下单,然后拿返回的结果来请求支付。

一共三步:

1.小程序端通过wx.login的返回的code换取openid 2.服务端向微信统一下单 3.小程序端发起支付

事先准备好这几样东西:

APPID = 'wx426b3015555a46be';
MCHID = '1900009851';
KEY = '8934e7d15453e97507ef794cf7b0519d';
APPSECRET = '7813490da6f1265e4901ffb80afaa36f';

PHP SDK,下载链接见文尾

第1、4样是申请小程序时获得的,第2、3样是申请开通微信支付时获得的,注意第3、4样长得比较像,其实是2个东西,两者混淆将导致签名通不过。

向微信端下单,得到prepay_id

1. 创建一个Controller,引并WxPay.Api.php类

之后可以通过index.php/wxpay来作访问请求

2. 修改配置文件WxPay.Config.php

改成自己申请得到相应key

3. 实现index方法

function index() {
//     初始化值对象
    $input = new WxPayUnifiedOrder();
//     文档提及的参数规范:商家名称-销售商品类目
    $input->SetBody("灵动商城-手机");
//     订单号应该是由小程序端传给服务端的,在用户下单时即生成,demo中取值是一个生成的时间戳
    $input->SetOut_trade_no('123123123');
//     费用应该是由小程序端传给服务端的,在用户下单时告知服务端应付金额,demo中取值是1,即1分钱
    $input->SetTotal_fee("1");
    $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");
    $input->SetTrade_type("JSAPI");
//     由小程序端传给服务端
    $input->SetOpenid($this->input->post('openId'));
//     向微信统一下单,并返回order,它是一个array数组
    $order = WxPayApi::unifiedOrder($input);
//     json化返回给小程序端
    header("Content-Type: application/json");
    echo json_encode($order);
  }

说明1:文档上提到的nonce_str不是没提交,而是sdk帮我们填上的

出处在WxPay.Api.php第55行

$inputObj->SetNonce_str(self::getNonceStr());//随机字符串

说明2:sign也已经好心地给setSign了,出处在WxPay.Data.php第111行,MakeSign()中

/**
  * 生成签名
  * @return 签名,本函数不覆盖sign成员变量,如要设置签名需要调用SetSign方法赋值
  */
 public function MakeSign()
 {
   //签名步骤一:按字典序排序参数
   ksort($this->values);
   $string = $this->ToUrlParams();
   //签名步骤二:在string后加入KEY
   $string = $string . "&key=".WxPayConfig::KEY;
   //签名步骤三:MD5加密
   $string = md5($string);
   //签名步骤四:所有字符转为大写
   $result = strtoupper($string);
   return $result;
 }

4. 小程序内调用登录接口,获取openid

向微信登录请求,拿到code,再将code提交换取openId

wx.login({
     success: function(res) {
      if (res.code) {
       //发起网络请求
       wx.request({
        url: 'https://api.weixin.qq.com/sns/jscode2session?appid=wx9114b997bd86f***&secret=d27551c7803cf16015e536b192******&js_code='+res.code+'&grant_type=authorization_code',
        data: {
         code: res.code
        },
        success: function (response) {
          console.log(response);
        }
       })
      } else {
       console.log('获取用户登录态失败!' + res.errMsg)
      }
     }
    });

从控制台看到已经成功拿到openid,剩下的事情就是将它传到服务端就好了,服务端那边$this->input->post('openId')等着收呢。

5. 小程序端向https://lendoo.leanapp.cn/index.php/WXPay发起请求,作统一下单

//统一下单接口对接
      wx.request({
        url: 'https://lendoo.leanapp.cn/index.php/WXPay',
        data: {
          openId: openId
        },
        success: function (response) {
          console.log(response);
 
        },
            header: {
        'content-type': 'application/x-www-form-urlencoded'
    },
      });

得到如下结果

{
 "appid": "wx9114b997bd86f8ed",
 "mch_id": "1414142302",
 "nonce_str": "eEICgYFuGqxFRK6f",
 "prepay_id": "wx201701022235141fc713b8f80137935406",
 "result_code": "SUCCESS",
 "return_code": "SUCCESS",
 "return_msg": "OK",
 "sign": "63E60C8CD90394FB50E612D085F5362C",
 "trade_type": "JSAPI"
}

前提是https://lendoo.leanapp.cn已经在白名单:

6. 小程序端调起支付API

// 发起支付
var appId = response.data.appid;
var timeStamp = (Date.parse(new Date()) / 1000).toString();
var pkg = 'prepay_id=' + response.data.prepay_id;
var nOnceStr= response.data.nonce_str;
var paySign = md5.hex_md5('appId='+appId+'&nOnceStr='+nonceStr+'&package='+pkg+'&signType=MD5&timeStamp='+timeStamp+"&key=d27551c7803cf16***e536b192d5d03b").toUpperCase();
console.log(paySign);
console.log(appId);
wx.requestPayment({
  'timeStamp': timeStamp,
  'nonceStr': nonceStr,
  'package': pkg,
  'signType': 'MD5',
  'paySign': paySign,
  'success':function(res){
    console.log('success');
    console.log(res);
  }
});

模拟器测试,将弹出一个二维码供扫描

结果报了一个错误:

errMsg:"requestPayment:fail"
err_code:2
err_desc:"支付验证签名失败"

key需要加入到签名中!!!'appId='+appId+'&nOnceStr='+nonceStr+'&package='+pkg+'&signType=MD5&timeStamp='+timeStamp+"&key=d27551c7803cf16*e536b192d5d03b"这才是完整的。

可是文档里明明没提到key啊

支付成功截图

更多PHP:微信小程序 微信支付服务端集成实例详解及源码下载相关文章请关注PHP中文网!

推荐阅读
  • 校园表白墙微信小程序,校园小情书、告白墙、论坛,大学表白墙搭建教程
    小程序的名字必须和你微信注册的名称一模一样在后台注册好小程序。mp.wx-union.cn后台域名https。mp.wx-union.cn ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 微信民众号商城/小顺序商城开源项目介绍及使用教程
    本文介绍了一个基于WeiPHP5.0开发的微信民众号商城/小顺序商城的开源项目,包括前端和后端的目录结构,以及所使用的技术栈。同时提供了项目的运行和打包方法,并分享了一些调试和开发经验。最后还附上了在线预览和GitHub商城源码的链接,以及加入前端交流QQ群的方式。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 小程序自动授权和手动接入的方式及操作步骤
    本文介绍了小程序支持的两种接入方式:自动授权和手动接入,并详细说明了它们的操作步骤。同时还介绍了如何在两种方式之间切换,以及手动接入后如何下载代码包和提交审核。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 2016 linux发行版排行_灵越7590 安装 linux (manjarognome)
    RT之前做了一次灵越7590黑苹果炒作业的文章,希望能够分享给更多不想折腾的人。kawauso:教你如何给灵越7590黑苹果抄作业​zhuanlan.z ... [详细]
  • 手把手教你使用GraphPad Prism和Excel绘制回归分析结果的森林图
    本文介绍了使用GraphPad Prism和Excel绘制回归分析结果的森林图的方法。通过展示森林图,可以更加直观地将回归分析结果可视化。GraphPad Prism是一款专门为医学专业人士设计的绘图软件,同时也兼顾统计分析的功能,操作便捷,可以帮助科研人员轻松绘制出高质量的专业图形。文章以一篇发表在JACC杂志上的研究为例,利用其中的多因素回归分析结果来绘制森林图。通过本文的指导,读者可以学会如何使用GraphPad Prism和Excel绘制回归分析结果的森林图。 ... [详细]
  • 微信答题小程序的设计与实现详解
    本文详细介绍了如何设计和实现一个微信答题小程序,包括题库的设计和题目的呈现。通过抽取题目编号和使用全局变量记录当前题目的信息,实现了题目的刷新和显示。同时,还介绍了题目的展示方式和容器的创建。本文适合零基础的小白学习微信答题小程序的开发。 ... [详细]
  • 14亿人的大项目,腾讯云数据库拿下!
    全国人 ... [详细]
  • 使用flex弹性布局来为微信小程序写自适应页面
    我们知道,写习惯了前端的人,一般切图后布局页面的话,上手最习惯的是基于盒子模型的浮动布局,依赖display属性positi ... [详细]
  • PHP小习题:PHP小练习题前几天在百度知道里面看到有位网友询问如何制作一下的小程序:用php语言设计一个小程序,计算今天到达下月的天数、全部输出这些天数,并使得每天的日期以三种颜 ... [详细]
  • vuecli创建项目(详情步骤)
    1、安装node环境2、下载vue和vue-cli脚手架命令行输入npm ... [详细]
author-avatar
itbases
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有