微信小程序与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 相关文章推荐
用jQuery中的ajax分页实现代码
Sep 20 Javascript
js jquery验证银行卡号信息正则学习
Jan 21 Javascript
JavaScript版TAB选项卡效果实例
Aug 16 Javascript
jquery实现的省市区三级联动
Apr 02 Javascript
关于数据与后端进行交流匹配(点亮星星)
Aug 03 Javascript
ES6新特性之解构、参数、模块和记号用法示例
Apr 01 Javascript
jQuery遮罩层实例讲解
May 11 jQuery
JS实现图片居中悬浮效果
Dec 25 Javascript
Node.js使用Koa搭建 基础项目
Jan 08 Javascript
移动端(微信等使用vConsole调试console的方法
Mar 05 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
Apr 16 Javascript
JS对日期操作封装代码实例
Nov 08 Javascript
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
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
PHP截取指定图片大小的方法
2014/12/10 PHP
php计算给定时间之前的函数用法实例
2015/04/03 PHP
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
PHP保留两位小数的几种方法
2019/07/24 PHP
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
2014/12/19 Javascript
node.js操作mongodb学习小结
2015/04/25 Javascript
常用的Javascript设计模式小结
2015/12/09 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
2016/05/27 Javascript
Bootstrap风格的zTree右键菜单
2017/02/17 Javascript
无法获取隐藏元素宽度和高度的解决方案
2017/03/07 Javascript
Nodejs使用archiver-zip-encrypted库加密压缩文件时报错(解决方案)
2019/11/18 NodeJs
JS实现简单日历特效
2020/01/03 Javascript
vue自动添加浏览器兼容前后缀操作
2020/08/13 Javascript
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
python里大整数相乘相关技巧指南
2014/09/12 Python
Python中常见的数据类型小结
2015/08/29 Python
用python实现对比两张图片的不同
2018/02/05 Python
python GUI图形化编程wxpython的使用
2019/07/19 Python
django 中QuerySet特性功能详解
2019/07/25 Python
Python绘制二维曲线的日常应用详解
2019/12/04 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
美国打印机墨水和碳粉购物网站:QuikShip Toner
2018/08/29 全球购物
尤为Wconcept中国官网:韩国设计师品牌服饰
2019/01/10 全球购物
法国女性内衣购物网站:Glamuse
2019/05/13 全球购物
澳大利亚窗帘商店:Curtain Wonderland
2019/12/01 全球购物
爱尔兰橄榄球店:Irish Rugby Store
2019/12/05 全球购物
Linux不知道文件后缀名怎么判断文件类型
2012/04/26 面试题
个人创业事迹材料
2014/12/30 职场文书
民事答辩状格式范文
2015/05/21 职场文书
结婚典礼致辞
2015/07/28 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS
Flask response响应的具体使用
2021/07/15 Python