微信小程序与php 实现微信支付的简单实例


Posted in Javascript onJune 23, 2017

微信小程序与php 实现微信支付的简单实例

小程序访问地址:

payfee.PHP:

include 'WeixinPay.php'; 
$appid=''; 
$openid= $_GET['id']; 
$mch_id=''; 
$key=''; 
$out_trade_no = $mch_id. time(); 
$total_fee = $_GET['fee']; 
if(empty($total_fee)) //押金 
{ 
  $body = "充值押金"; 
  $total_fee = floatval(99*100); 
} 
 else { 
   $body = "充值余额"; 
   $total_fee = floatval($total_fee*100); 
 } 
$weixinpay = new WeixinPay($appid,$openid,$mch_id,$key,$out_trade_no,$body,$total_fee); 
$return=$weixinpay->pay(); 
 
echo json_encode($return);

WeixinPay.php:

<?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' => '2015450806125348', //商户订单号 
      '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' => 'http://www.weixin.qq.com/wxpay/pay.php', //通知地址 确保外网能正常访问 
      '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); //严格校验 
    //设置header 
    curl_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"); 
    } 
  } 
   
   
   
  //数组转换成xml 
  private function arrayToXml($arr) { 
    $xml = "<root>"; 
    foreach ($arr as $key => $val) { 
      if (is_array($val)) { 
        $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">"; 
      } else { 
        $xml .= "<" . $key . ">" . $val . "</" . $key . ">"; 
      } 
    } 
    $xml .= "</root>"; 
    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; 
  } 
 
 
}

小程序页面处理:

wx.request({ 
url:'https://www.yourhost.com/weixin/WeiActivity/payfee.php',//改成你自己的链接 
header:{ 
'Content-Type':'application/x-www-form-urlencoded' 
}, 
method:'POST', 
success:function(res){ 
console.log(res.data); 
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){ 
console.log('fail'); 
}, 
'complete':function(res){ 
console.log('complete'); 
} 
}); 
}, 
fail:function(res){ 
console.log(res.data) 
} 
});

回调url:notify.php

$postXml = $GLOBALS["HTTP_RAW_POST_DATA"]; //接收微信参数 
if (empty($postXml)) { 
  return false; 
} 
 
//将xml格式转换成数组 
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; 
} 
 
$attr = xmlToArray($postXml); 
 
$total_fee = $attr[total_fee]; 
$open_id = $attr[openid]; 
$out_trade_no = $attr[out_trade_no]; 
$time = $attr[time_end];

以上几步你就可以完成小程序的微信支付与php完美的结合起来

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
js点击更换背景颜色或图片的实例代码
Jun 25 Javascript
js获取控件位置以及不同浏览器中的差别介绍
Aug 08 Javascript
javascript验证身份证完全方法具体实现
Nov 18 Javascript
js动态添加表格数据使用insertRow和insertCell实现
May 22 Javascript
分享9点个人认为比较重要的javascript 编程技巧
Apr 27 Javascript
js省市县三级联动效果实例
Apr 15 Javascript
js 事件的传播机制(实例讲解)
Jul 20 Javascript
webpack4.0 入门实践教程
Oct 08 Javascript
微信小程序 wxParse插件显示视频问题
Sep 27 Javascript
JS运算符简单用法示例
Jan 19 Javascript
如何通过Proxy实现JSBridge模块化封装
Oct 22 Javascript
利用Vue实现简易播放器的完整代码
Dec 30 Vue.js
jquery单击文字或图片内容放大并居中显示
Jun 23 #jQuery
详解webpack异步加载业务模块
Jun 23 #Javascript
详解微信第三方小程序代开发
Jun 23 #Javascript
Easyui在treegrid添加控件的实现方法
Jun 23 #Javascript
详解用vue.js和laravel实现微信支付
Jun 23 #Javascript
详解用vue.js和laravel实现微信授权登陆
Jun 23 #Javascript
妙用Angularjs实现表格按指定列排序
Jun 23 #Javascript
You might like
在WINDOWS中设置计划任务执行PHP文件的方法
2011/12/19 PHP
PHP判断远程图片是否存在的几种方法
2014/05/04 PHP
php生成zip文件类实例
2015/04/07 PHP
php和html的区别点详细总结
2019/09/24 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
2020/05/15 PHP
修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
2009/10/11 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
js 中的switch表达式使用示例
2020/06/03 Javascript
js纯数字逐一停止显示效果的实现代码
2016/03/16 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
Bootstrap弹出框之自定义悬停框标题、内容和样式示例代码
2017/07/11 Javascript
Phaser.js实现简单的跑酷游戏附源码下载
2018/10/26 Javascript
微信小程序中button去除默认的边框实例代码
2019/08/01 Javascript
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
2020/11/20 Vue.js
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
python错误处理详解
2014/09/28 Python
Python数据结构与算法之列表(链表,linked list)简单实现
2017/10/30 Python
Python json模块dumps、loads操作示例
2018/09/06 Python
Python实现的爬取百度文库功能示例
2019/02/16 Python
Python编程学习之如何判断3个数的大小
2019/08/07 Python
python SVD压缩图像的实现代码
2019/11/05 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
Clarria化妆品官方网站:购买天然和有机化妆品系列
2018/04/08 全球购物
商学院大学生求职的自我评价
2014/03/12 职场文书
学雷锋志愿者活动总结
2014/06/27 职场文书
机械操作工岗位职责
2014/08/08 职场文书
2015年教师节活动总结
2015/03/20 职场文书
文明上网主题班会
2015/08/14 职场文书
竞聘书的秘诀
2019/04/02 职场文书
MySQL Shell的介绍以及安装
2021/04/24 MySQL
python实现会员管理系统
2022/03/18 Python
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle
python单向链表实例详解
2022/05/25 Python