微信小程序与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 sort排序使用方法
Oct 17 Javascript
实现只能输入数字的input不用replace方法
Sep 12 Javascript
在javaScript中关于submit和button的区别介绍
Oct 20 Javascript
jQuery修改class属性和CSS样式整理
Jan 30 Javascript
Javascript原型链的原理详解
Jan 05 Javascript
详解javascript实现自定义事件
Jan 19 Javascript
基于jquery的on和click的区别详解
Jan 15 jQuery
vue中本地静态图片路径写法
Mar 06 Javascript
原生JavaScript实现remove()和recover()功能示例
Jul 24 Javascript
Vue常见面试题整理【值得收藏】
Sep 20 Javascript
浅谈Vuex注入Vue生命周期的过程
May 20 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
Sep 18 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读取XML值的代码(推荐)
2011/01/01 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
PHP中散列密码的安全性分析
2019/07/26 PHP
fix-ie5.js扩展在IE5下不能使用的几个方法
2007/08/20 Javascript
JavaScript实现url地址自动检测并添加URL链接示例代码
2013/11/12 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
基于JavaScript实现购物网站商品放大镜效果
2016/09/06 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
在javascript中,null>=0 为真,null==0却为假,null的值详解
2017/02/22 Javascript
基于react后端渲染模板引擎noox发布使用
2018/01/11 Javascript
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
基于datepicker定义自己的angular时间组件的示例
2018/03/14 Javascript
分享5个好用的javascript文件上传插件
2018/09/16 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
angularJs中json数据转换与本地存储的实例
2018/10/08 Javascript
查找Vue中下标的操作(some和findindex)
2020/08/12 Javascript
JavaScript使用setTimeout实现倒计时效果
2021/02/19 Javascript
[40:53]完美世界DOTA2联赛PWL S3 Magma vs DLG 第二场 12.18
2020/12/20 DOTA
python实现自动更换ip的方法
2015/05/05 Python
python 爬虫出现403禁止访问错误详解
2017/03/11 Python
python统计多维数组的行数和列数实例
2018/06/23 Python
Pycharm取消py脚本中SQL识别的方法
2018/11/29 Python
python之信息加密题目详解
2019/06/26 Python
Jupyter notebook设置背景主题,字体大小及自动补全代码的操作
2020/04/13 Python
详解Html5微信支付爬坑之路
2018/07/24 HTML / CSS
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
千禧酒店及度假村官方网站:Millennium Hotels and Resorts
2019/05/10 全球购物
SheIn沙特阿拉伯:女装在线
2020/03/23 全球购物
extern是什么意思
2016/03/10 面试题
企业年会主持词
2014/03/27 职场文书
付款委托书范本
2014/04/04 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
小学生常见病防治方案
2014/06/06 职场文书
SQL注入的实现以及防范示例详解
2021/06/02 MySQL
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
2021/06/05 Python
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript