微信小程序 支付功能实现PHP实例详解


Posted in Javascript onMay 12, 2017

微信小程序 支付功能实现PHP实例详解

前端代码:

wx.request({
    url: 'https://www.yourhost.com/weixin/WeiActivity/payJoinfee',//改成你自己的链接
    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)
    }
  });

后端代码:

//支付费用
 public function payJoinfee(){
 $appid='wx888888888';
 $openid='oCQwY0Q_pzrQpu8888888';
 $mch_id='141388888';
 $key='9A0A86888888888';
 
 import('Weixin.Lib.WeixinPay');
 $weixinpay = new \WeixinPay($appid,$openid,$mch_id,$key);
 $return=$weixinpay->pay();

 $this->response($return,'json');
 }

微信支付类

<?php
/*
 * 小程序微信支付
 */
class WeixinPay{
 protected $appid;
 protected $mch_id;
 protected $key;
 protected $openid;
 function __construct($appid,$openid,$mch_id,$key){
 $this->appid=$appid;
 $this->openid=$openid;
 $this->mch_id=$mch_id;
 $this->key=$key;
 } 
 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'=>'测试',//商品描述
  'out_trade_no'=>'2015450806125346',//商户订单号
  'total_fee'=>floatval(0.01*100),//总金额 单位 分
  'spbill_create_ip'=>$_SERVER['REMOTE_ADDR'],//终端IP
  'notify_url'=>'http://www.weixin.qq.com/wxpay/pay.php',//通知地址
  'openid'=>$this->openid,//用户id
  'trade_type'=>'JSAPI'//交易类型
 );
 //统一下单签名
 $parameters['sign']=$this->getSign($parameters);
 $xmlData=arrayToXml($parameters);
 
 $return=xmlToArray(postXmlSSLCurl($xmlData,$url,60));
 
 return $return;
 }
 //微信小程序接口
 private function weixinapp(){
 //统一下单接口
 $unifiedorder=$this->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;
 }
}

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

Javascript 相关文章推荐
jquery 操作DOM案例代码分享
Apr 05 Javascript
js不能跳转到上一页面的问题解决方法
Mar 01 Javascript
使用jQuery时Form表单元素ID和name命名大忌
Mar 06 Javascript
jquery查找父元素、子元素(个人经验总结)
Apr 09 Javascript
通过示例彻底搞懂js闭包
Aug 10 Javascript
浅谈Vue.nextTick 的实现方法
Oct 25 Javascript
JS中Map和ForEach的区别
Feb 05 Javascript
配置eslint规范项目代码风格
Mar 11 Javascript
js实现页面多个日期时间倒计时效果
Jun 20 Javascript
vue实现配置全局访问路径头(axios)
Nov 01 Javascript
Typescript3.9 常用新特性一览(推荐)
May 14 Javascript
js删除指定位置超链接中含有百度与360的标题
Jan 06 Javascript
深入理解JavaScript继承的多种方式和优缺点
May 12 #Javascript
JS实现图片预加载之无序预加载功能代码
May 12 #Javascript
详解React开发中使用require.ensure()按需加载ES6组件
May 12 #Javascript
vue学习笔记之指令v-text &amp;&amp; v-html &amp;&amp; v-bind详解
May 12 #Javascript
JS常用正则表达式总结【经典】
May 12 #Javascript
vue.js的安装方法
May 12 #Javascript
JS匹配日期和时间的正则表达式示例
May 12 #Javascript
You might like
PHP4实际应用经验篇(3)
2006/10/09 PHP
Memcached常用命令以及使用说明详解
2013/06/27 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
图片自动缩小的js代码,用以防止图片撑破页面
2007/03/12 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
jQuery原生的动画效果
2015/07/10 Javascript
微信小程序 框架详解及实例应用
2016/09/26 Javascript
JS数组搜索之折半搜索实现方法分析
2017/03/27 Javascript
JavaScript实现的商品抢购倒计时功能示例
2017/04/17 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
vue的事件绑定与方法详解
2017/08/16 Javascript
手写Node静态资源服务器的实现方法
2018/03/20 Javascript
多个vue子路由文件自动化合并的方法
2019/09/03 Javascript
vue循环数组改变点击文字的颜色
2019/10/14 Javascript
vue 解决setTimeOut和setInterval函数无效报错的问题
2020/07/30 Javascript
Vue 使用iframe引用html页面实现vue和html页面方法的调用操作
2020/11/16 Javascript
如何利用nodejs自动定时发送邮件提醒(超实用)
2020/12/01 NodeJs
[01:16:37]【全国守擂赛】第三周决赛 Dark Knight vs. 一个弱队
2020/05/04 DOTA
python实现电子词典
2020/04/23 Python
Python可变参数函数用法实例
2015/07/07 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
实例详解python函数的对象、函数嵌套、名称空间和作用域
2019/05/31 Python
opencv转换颜色空间更改图片背景
2019/08/20 Python
在python中创建指定大小的多维数组方式
2019/11/28 Python
Pytorch 神经网络—自定义数据集上实现教程
2020/01/07 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
python实现图片转字符画的完整代码
2021/02/21 Python
西班牙最大的在线滑板和街头服饰商店:Fillow.net
2019/04/15 全球购物
包装类的功能、种类、常用方法
2012/01/27 面试题
微笑服务演讲稿
2014/05/13 职场文书
2014年质检工作总结
2014/11/26 职场文书
鲁迅故里导游词
2015/02/05 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书
JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)
2021/05/26 Servers