微信小程序 支付功能实现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 相关文章推荐
Javascript中的数学函数集合
May 08 Javascript
javascript 导出数据到Excel(处理table中的元素)
Dec 18 Javascript
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
Jan 15 Javascript
js数组去重的5种算法实现
Nov 04 Javascript
举例说明如何为JavaScript的方法参数设置默认值
Nov 17 Javascript
三个js循环的关键字示例(for与while)
Feb 16 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
Apr 29 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
Dec 27 Javascript
Vue.js手风琴菜单组件开发实例
May 16 Javascript
angular中实现li或者某个元素点击变色的两种方法
Jul 27 Javascript
深入理解javascript prototype的相关知识
Sep 19 Javascript
微信小程序实现点击图片放大预览
Oct 21 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防止刷新重复提交页面的示例代码
2015/11/11 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
Laravel 类和接口注入相关的代码
2019/10/15 PHP
JS代码判断IE6,IE7,IE8,IE9的函数代码
2013/08/02 Javascript
js加减乘除丢失精度问题解决方法
2014/05/16 Javascript
jquery获取css的color值返回RGB的方法
2015/12/18 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
NodeJS使用七牛云存储上传文件的方法
2017/07/24 NodeJs
详解Webpack loader 之 file-loader
2018/11/07 Javascript
ECharts地图绘制和钻取简易接口详解
2019/07/12 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
详解js location.href和window.open的几种用法和区别
2019/12/02 Javascript
Python中实现对Timestamp和Datetime及UTC时间之间的转换
2015/04/08 Python
Python实现批量下载图片的方法
2015/07/08 Python
Python 模拟员工信息数据库操作的实例
2017/10/23 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
wxPython多个窗口的基本结构
2019/11/19 Python
pycharm无法导入本地模块的解决方式
2020/02/12 Python
Python urllib.request对象案例解析
2020/05/11 Python
CSS3 实现的火焰动画
2020/12/07 HTML / CSS
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
ProBikeKit新西兰:自行车套件,跑步和铁人三项装备
2017/04/05 全球购物
巴西最大的在线约会网站:ParPerfeito
2018/07/11 全球购物
美国LOGO设计公司:The Logo Company
2018/07/16 全球购物
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
英文简历中的自我评价用语
2013/12/09 职场文书
励志演讲稿300字
2014/08/21 职场文书
创先争优活动承诺书
2014/08/30 职场文书
老人节标语大全
2014/10/08 职场文书
英文感谢信范文
2015/01/21 职场文书
综合办公室主任岗位职责
2015/04/01 职场文书
婚礼长辈答谢词
2015/09/29 职场文书
2019年干货:自我鉴定
2019/03/25 职场文书
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python
PYTHON 使用 Pandas 删除某列指定值所在的行
2022/04/28 Python
python的html标准库
2022/04/29 Python