我们先看测试页面

如下是代码

<!--index.wxml-->
<view class="container"><view class="container"><button bindtap='dianji' type="primary">测试支付0.01元</button></view>
</view>
// index.js
// 获取应用实例
const app = getApp()Page({data: {motto: 'Hello World',userInfo: {},hasUserInfo: false,canIUse: wx.canIUse('button.open-type.getUserInfo'),canIUseGetUserProfile: false,openId:'',canIUseOpenData: wx.canIUse('open-data.type.userAvatarUrl') && wx.canIUse('open-data.type.userNickName') // 如需尝试获取用户信息可改为false},onLoad() {// 微信登录获取openIDwx.login({success:(re)=>{console.log(re);// 必须是在用户已经授权的情况下调用wx.getUserInfo({success: (res)=>{var data_arr = {code:re.code,appid:'  ', //你的APPIDiv:res.iv,encryptedData:res.encryptedData,};// 请求接口wx.request({url: 'https://www.xxx.cn/yzxx_openid',header: {'Content-Type': 'application/x-www-form-urlencoded'},data:data_arr,method: 'POST',success:(res1)=>{this.openId = JSON.parse(res1.data.data).openId;}})}});}})},dianji(){wx.request({url: 'https://www.xxx.cn/yzxx_wxpayfee',//请求地址data:{id: this.openId,//获取用户openidfee:0.01 //金额},header: {'Content-Type': 'application/x-www-form-urlencoded'},method: 'POST',success: function (res) {console.log('调起支付');wx.requestPayment({'timeStamp': res.data.timeStamp,'nonceStr': res.data.nonceStr,'package': res.data.package,'signType': 'MD5','paySign': res.data.paySign,'success': function (res) {console.log('success');wx.showToast({title: '支付成功',icon: 'success',duration: 3000});},'fail': function (res) {wx.showToast({title: '支付失败',icon:'none'})},'complete': function (res) {console.log('complete');}});},fail: function (res) {console.log(res.data)}});},
})

接下来是我们后台的代码

// 获取openidpublic function yzxx_openid(){include_once VENDOR_PATH.'wxBizDataCrypt.php';$appid=$_POST['appid'];        $code=$_POST['code']; $encryptedData=$_POST['encryptedData'];$iv = $_POST['iv'];// 使用code获得session_key    if(!empty($code) && !empty($appid) && empty($this->yzxx_sessionKey)){$url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$appid.'&secret=SECRET&js_code='.$code.'&grant_type=authorization_code';$content = json_decode(file_get_contents($url),true);// 保存到类属性中$this->yzxx_sessionKey = $content['session_key'];}if(empty($appid) || empty($code) || empty($encryptedData) || empty($iv)){$this->_jsonError('-1','参数错误');exit;}$pc = new \WXBizDataCrypt($appid,$this->yzxx_sessionKey);$errCode = $pc->decryptData($encryptedData, $iv, $data );if ($errCode == 0) {// 成功$this->_jsonResult($data);exit;} else {// 失败$this->_jsonError('-1','获取失败'.$errCode);exit;}}// 支付回调public function yzxx_notify(){$postXml = $GLOBALS["HTTP_RAW_POST_DATA"]; //接收微信参数 // 接受不到参数可以使用file_get_contents("php://input"); PHP高版本中$GLOBALS好像已经被废弃了if (empty($postXml)) {return false;}$attr = $this->xmlToArray($postXml);$total_fee = $attr['total_fee'];$open_id = $attr['openid'];$out_trade_no = $attr['out_trade_no'];$time = $attr['time_end'];}//将xml格式转换成数组public function xmlToArray($xml) {//禁止引用外部xml实体 libxml_disable_entity_loader(true);$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);$val = json_decode(json_encode($xmlstring), true);return $val;}// 获取微信订单号public function yzxx_wxpayfee(){include_once VENDOR_PATH. 'Wxpay/WeixinPay.php';$appid=''; //小程序appid$openid= $_POST['id'];$mch_id=''; //微信支付商户支付号$key=''; //Api密钥$out_trade_no = $mch_id.time();$total_fee = $_POST['fee'];  // 金额if (empty($total_fee)) { //押金$this->_jsonError('-1','参数错误');exit;} else {$body = "支付金额";$total_fee = floatval($total_fee*100); // 由于微信中的金额是以分为单位所以要乘100}$weixinpay = new \WeixinPay($appid,$openid,$mch_id,$key,$out_trade_no,$body,$total_fee);$return=$weixinpay->pay();echo json_encode($return);}

我把那个支付类也给大家准备好了,如下代码

<?php
/** 小程序微信支付*/
class WeixinPay {protected $appid;protected $mch_id;protected $key;protected $openid;protected $out_trade_no;protected $body;protected $total_fee;function __construct($appid, $openid, $mch_id, $key,$out_trade_no,$body,$total_fee) {$this->appid = $appid;$this->openid = $openid;$this->mch_id = $mch_id;$this->key = $key;$this->out_trade_no = $out_trade_no;$this->body = $body;$this->total_fee = $total_fee;}public function pay() {//统一下单接口$return = $this->weixinapp();return $return;}//统一下单接口private function unifiedorder() {$url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';$parameters = array('appid' => $this->appid, //小程序ID'mch_id' => $this->mch_id, //商户号'nonce_str' => $this->createNoncestr(), //随机字符串
//      'body' => 'test', //商品描述'body' => $this->body,
//      'out_trade_no' => '2018013106125348', //商户订单号'out_trade_no'=> $this->out_trade_no,
//      'total_fee' => floatval(0.01 * 100), //总金额 单位 分'total_fee' => $this->total_fee,'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], //终端IP// 'spbill_create_ip' => '192.168.0.161', //终端IP'notify_url' => 'https://www.xxx.cn/yzxx_notify', //通知地址 确保外网能正常访问'openid' => $this->openid, //用户id'trade_type' => 'JSAPI'//交易类型);//统一下单签名$parameters['sign'] = $this->getSign($parameters);$xmlData = $this->arrayToXml($parameters);$return = $this->xmlToArray($this->postXmlCurl($xmlData, $url, 60));return $return;}private static function postXmlCurl($xml, $url, $second = 30) {$ch = curl_init();//设置超时curl_setopt($ch, CURLOPT_TIMEOUT, $second);curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //严格校验//设置headercurl_setopt($ch, CURLOPT_HEADER, FALSE);//要求结果为字符串且输出到屏幕上curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);//post提交方式curl_setopt($ch, CURLOPT_POST, TRUE);curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);curl_setopt($ch, CURLOPT_TIMEOUT, 40);set_time_limit(0);//运行curl$data = curl_exec($ch);//返回结果if ($data) {curl_close($ch);return $data;} else {$error = curl_errno($ch);curl_close($ch);throw new WxPayException("curl出错,错误码:$error");}}//数组转换成xmlprivate function arrayToXml($arr) {$xml = "<xml>";foreach ($arr as $key => $val) {if (is_array($val)) {$xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";} else {$xml .= "<" . $key . ">" . $val . "</" . $key . ">";}}$xml .= "</xml>";return $xml;}//xml转换成数组private function xmlToArray($xml) {//禁止引用外部xml实体 libxml_disable_entity_loader(true);$xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);$val = json_decode(json_encode($xmlstring), true);return $val;}//微信小程序接口private function weixinapp() {//统一下单接口$unifiedorder = $this->unifiedorder();
//    print_r($unifiedorder);$parameters = array('appId' => $this->appid, //小程序ID'timeStamp' => '' . time() . '', //时间戳'nonceStr' => $this->createNoncestr(), //随机串'package' => 'prepay_id=' . $unifiedorder['prepay_id'], //数据包'signType' => 'MD5'//签名方式);//签名$parameters['paySign'] = $this->getSign($parameters);return $parameters;}//作用:产生随机字符串,不长于32位private function createNoncestr($length = 32) {$chars = "abcdefghijklmnopqrstuvwxyz0123456789";$str = "";for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } //作用:生成签名 private function getSign($Obj) { foreach ($Obj as $k => $v) {$Parameters[$k] = $v;}//签名步骤一:按字典序排序参数ksort($Parameters);$String = $this->formatBizQueryParaMap($Parameters, false);//签名步骤二:在string后加入KEY$String = $String . "&key=" . $this->key;//签名步骤三:MD5加密$String = md5($String);//签名步骤四:所有字符转为大写$result_ = strtoupper($String);return $result_;}///作用:格式化参数,签名过程需要使用private function formatBizQueryParaMap($paraMap, $urlencode) {$buff = "";ksort($paraMap);foreach ($paraMap as $k => $v) {if ($urlencode) {$v = urlencode($v);}$buff .= $k . "=" . $v . "&";}$reqPar = '';if (strlen($buff) > 0) {$reqPar = substr($buff, 0, strlen($buff) - 1);}return $reqPar;}
}
?>

支付成功之后回调地址需要在微信商户平台配置,这一点要注意(我们需要在回调里面将订单状态改变)
感谢大家观看,我们下次见。

PHP 小程序中微信支付相关推荐

  1. webview 个人小程序_微信小程序webview中,拉起小程序的微信支付 | 剑花烟雨江南...

    由于最近公司业务调整,需要在小程序的webview中拉起小程序的微信支付,经过各种爬坑和搜索,找到如下结果方法,供大家参考: 一.判断小程序浏览器 使用 USER_AGENT判断小程序还是公众号浏览器 ...

  2. springboot 微信小程序 对接微信支付功能(完整版)

    微信小程序对接微信支付功能 业务流程时序图 JAVA版 1. 项目架构 2. pom.xml配置文件 3. 小程序账号参数配置类 4.JAVA 通用代码 4.1 工具类 4.1.1 IdGen (id ...

  3. 微信小程序接入微信支付(二):后台调用统一下单接口

    微信统一支付官方文档:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1 因该接口需要商户系统中自己的订单编号,笔者先 ...

  4. Delphi调用微信原生Web开发接口JS-SDK开发小程序及微信支付等的Rest API

    目录 Delphi调用微信原生Web开发接口JS-SDK开发小程序及微信支付等的Rest API 一.概述及API 1.JS-SDK是对之前的 WeixinJSBridge 的一个包装 2.JS-SD ...

  5. 微信小程序接入微信支付(三):小程序端调用支付接口

    微信小程序调用支付接口官方文档:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_7&index=5 在上一节中 ...

  6. 微信小程序获取用户手机号码,Java后台servlet解密(微信小程序调用微信支付也是大致的流程)

    本篇记录说明 微信小程序获取用户手机号码,Java后台servlet解密(微信小程序调用微信支付也是大致的流程,详细内容可私信交流) (第一次写博客,写得不好的地方见谅,面向新手,大佬请无视,不喜勿喷 ...

  7. 小程序仿微信支付数字键盘,微信支付数字键盘

    小程序仿微信支付数字键盘,微信支付数字键盘 前段时间在一个小程序中需要写个支付页面,刚开始用input来唤起手机自带的数字键盘,甲方说不好看,然后说微信支付页面做的就比较好....于是就动手写了一个, ...

  8. 【微信小程序】微信支付接入全流程

    一. 前置条件 接入支付首先得需要有企业资质,并开通企业对公户 注册微信支付并进行对公户打款认证 二. 开始接入 1. 下载微信支付的AP证书 2. 服务端接入微信支付 2.1 引入相关maven配置 ...

  9. 使用uniapp开发字节跳动小程序的微信支付和支付宝支付(后端PHP,tp5)

    使用uniapp开发字节跳动小程序的微信支付和支付宝支付(后端PHP,tp5) 准备工作 微信支付配置 支付宝支付配置 字节跳动配置 1,微信支付配置: 开通微信支付的h5支付,关联APPID,保存k ...

最新文章

  1. C#反射技术之一动态读取和设置对象的属性值
  2. 近期知识图谱顶会论文推荐,另附超详笔记解读
  3. C# Winform编程之Button
  4. ES6模块与commonJS模块的差异
  5. 【卡法电子商务】-常用手机屏幕尺寸 ★★★★★
  6. 娜塔莉波特曼2015哈佛毕业演讲
  7. 1064金明的预算方案
  8. 苹果正在研发iPhone检测抑郁症功能
  9. JavaScript 基础(三) - Date对象,RegExp对象,Math对象,Window 对象,History 对象,Location 对象,DOM 节点...
  10. C语言system的用法
  11. 财务数据分析工作总结汇报PPT模板
  12. Linux后台运行程序最实用的两种方式
  13. PingTunnel隧道搭建
  14. balenaEtcher for mac(U盘启动盘制作工具)
  15. 时间序列分析——第三章 资产收益率序列
  16. 求职简历中一些常见的问题
  17. 浏览器性能对比测试技术研究与应用
  18. 实验7 Wireshark网络安全检测
  19. windows多进程探测存活主机
  20. 安卓程序中调用 linux 命令

热门文章

  1. Visio--用例图、类图、顺序图、活动图
  2. API接口开发其实特简单,Python Flask Web 框架教程来了
  3. 表单中enter键,导致表单提交
  4. 自然摄影指南——第一章:曝光:使用相机的测光表
  5. 大漠插件问题:解决win10win7win8系统找不到指定的模块,注册不了大漠插件的问题
  6. 微信小程序修改顶部通知栏字体颜色,手机电量时间.....。
  7. ECshop生成网站地图url
  8. WebSocket 入门:简易聊天室
  9. 利用栈实现精制转换c++
  10. 解决U盘使用DVD镜像安装Fedora15需要联网的问题