微信小程序 支付功能实现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 相关文章推荐
短信提示使用 特效
Jan 19 Javascript
SUN的《AJAX与J2EE》全文译了
Feb 23 Javascript
HTML代码中标签的全部属性 中文注释说明
Mar 26 Javascript
用js实现层随着内容大小动态渐变改变 推荐
Dec 19 Javascript
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
Jun 28 Javascript
js生成缩略图后上传并利用canvas重绘
May 15 Javascript
jQuery背景插件backstretch使用指南
Apr 21 Javascript
jQuery内存泄露解决办法
Dec 13 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
Jan 29 Javascript
Vue自定义图片懒加载指令v-lazyload详解
Dec 31 Javascript
带你快速理解javascript中的事件模型
Aug 14 Javascript
Javascript将图片的绝对路径转换为base64编码的方法
Jan 11 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
php下的权限算法的实现
2007/04/28 PHP
同台服务器使用缓存APC效率高于Memcached的演示代码
2010/02/16 PHP
PHP基础教程(php入门基础教程)一些code代码
2013/01/06 PHP
PHP获取QQ达人QQ信息的方法
2015/03/05 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
twig模板常用语句实例小结
2016/02/04 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
2016/03/07 PHP
PHP与SQL语句常用大全
2016/12/10 PHP
PHP检查端口是否可以被绑定的方法示例
2018/08/09 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
PHP内存溢出优化代码详解
2021/02/26 PHP
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
javascript 数据类型转换(parseInt,parseFloat)
2010/07/20 Javascript
解决iframe的frameborder在chrome/ff/ie下的差异
2010/08/12 Javascript
小试JQuery的AutoComplete插件
2011/05/04 Javascript
JavaScript中的类数组对象介绍
2014/12/30 Javascript
一个字符串中出现次数最多的字符 统计这个次数【实现代码】
2016/04/29 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
2018/12/11 Javascript
js核心基础之闭包的应用实例分析
2019/05/11 Javascript
iview form清除校验状态的实现
2019/09/19 Javascript
在Django中管理Users和Permissions以及Groups的方法
2015/07/23 Python
Python Nose框架编写测试用例方法
2017/10/26 Python
详解Python3中setuptools、Pip安装教程
2019/06/18 Python
python selenium 查找隐藏元素 自动播放视频功能
2019/07/24 Python
python输出带颜色字体实例方法
2019/09/01 Python
使用Django搭建网站实现商品分页功能
2020/05/22 Python
python实现学生管理系统开发
2020/07/24 Python
《我的第一本书》教学反思
2014/02/15 职场文书
全国税务系统先进集体事迹材料
2014/05/19 职场文书
创新社会管理心得体会
2014/09/12 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
2015年党员发展工作总结
2015/05/13 职场文书
六五普法心得体会2016
2016/01/21 职场文书
剑指Offer之Java算法习题精讲二叉树专项训练
2022/03/21 Java/Android
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS