微信小程序与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 相关文章推荐
IE8 浏览器Cookie的处理
Jan 31 Javascript
div模拟滚动条效果示例代码
Oct 16 Javascript
js取得html iframe中的元素和变量值
Jun 30 Javascript
JS JQUERY实现滚动条自动滚到底的方法
Jan 09 Javascript
Python脚本后台运行的几种方式
Mar 09 Javascript
Jquery实现纵向横向菜单
Jan 24 Javascript
javascript之IE版本检测超简单方法
Aug 20 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
Oct 14 Javascript
node 利用进程通信实现Cluster共享内存
Oct 27 Javascript
小程序tab页无法传递参数的方法
Aug 03 Javascript
原生js实现淘宝放大镜效果
Oct 28 Javascript
vue3 自定义图片放大器效果的示例代码
Jul 23 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
php5新改动之短标记启用方法
2008/09/11 PHP
php 生成随机验证码图片代码
2010/02/08 PHP
PHP类与对象中的private访问控制的疑问
2012/11/01 PHP
PHP实现读取一个1G的文件大小
2013/08/24 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
用户注册常用javascript代码
2009/08/29 Javascript
js获取dom的高度和宽度(可见区域及部分等等)
2013/06/13 Javascript
Ubuntu中搭建Nodejs开发环境过程分享
2014/06/01 NodeJs
JavaScript实现复制文章自动添加版权
2016/08/02 Javascript
Js操作DOM元素及获取浏览器高宽的简单方法
2016/09/08 Javascript
js实现tab选项卡切换功能
2017/01/13 Javascript
js仿淘宝商品放大预览功能
2017/03/15 Javascript
vue 父组件给子组件传值子组件给父组件传值的实例代码
2019/04/15 Javascript
JS删除String里某个字符的方法
2021/01/06 Javascript
[01:04:05]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
Python之读取TXT文件的方法小结
2018/04/27 Python
详解通过API管理或定制开发ECS实例
2018/09/30 Python
python matplotlib库绘制散点图例题解析
2019/08/10 Python
Python进程,多进程,获取进程id,给子进程传递参数操作示例
2019/10/11 Python
Tensorflow全局设置可见GPU编号操作
2020/06/30 Python
CSS3实现可翻转的hover效果
2018/05/23 HTML / CSS
中东地区为妈妈们提供一切的头号购物目的地:Sprii
2018/05/06 全球购物
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
写出程序把一个链表中的接点顺序倒排
2014/04/28 面试题
行政管理人员精品工作推荐信
2013/11/04 职场文书
一个大学生十年的职业规划
2014/01/17 职场文书
运动会四百米广播稿
2014/01/19 职场文书
开学典礼策划方案
2014/05/28 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
外贸英文求职信范文
2015/03/19 职场文书
详解Django中 render() 函数的使用方法
2021/04/22 Python
html form表单基础入门案例讲解
2021/07/15 HTML / CSS
HTML页面中使两个div并排显示的实现
2022/05/15 HTML / CSS
利用Python脚本写端口扫描器socket,python-nmap
2022/07/23 Python