微信小程序 支付功能实现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 相关文章推荐
Extjs EditorGridPanel中ComboBox列的显示问题
Jul 04 Javascript
zTree插件之多选下拉菜单实例代码
Nov 06 Javascript
动态显示可输入的字数提示还可以输入的字数
Apr 01 Javascript
jQuery表格排序组件-tablesorter使用示例
May 26 Javascript
Angular.js 实现数字转换汉字实例代码
Jul 14 Javascript
javascript基础知识之html5轮播图实例讲解(44)
Feb 17 Javascript
echarts学习笔记之图表自适应问题详解
Nov 22 Javascript
如何从0开始用node写一个自己的命令行程序
Dec 29 Javascript
tweenjs缓动算法的使用实例分析
Aug 26 Javascript
Layui实现数据表格默认全部显示(不要分页)
Oct 26 Javascript
vue 解决setTimeOut和setInterval函数无效报错的问题
Jul 30 Javascript
vue setInterval 定时器失效的解决方式
Jul 30 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新手NOTICE错误常见解决方法
2011/12/07 PHP
php实现斐波那契数列的简单写法
2014/07/19 PHP
微信公众号开发之语音消息识别php代码
2016/08/08 PHP
Javascript实例教程(19) 使用HoTMetal(4)
2006/12/23 Javascript
JS实现鼠标单击与双击事件共存
2014/03/08 Javascript
jquery实现增加删除行的方法
2015/02/03 Javascript
jQuery中hover方法和toggle方法使用指南
2015/02/27 Javascript
Javascript连接Access数据库完整实例
2015/08/03 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
js 概率计算(简单版)
2017/09/12 Javascript
vue 2.x 中axios 封装的get 和post方法
2018/02/28 Javascript
JS实现二维数组元素的排列组合运算简单示例
2019/01/28 Javascript
Vue基本使用之对象提供的属性功能
2019/04/30 Javascript
在weex中愉快的使用scss的方法步骤
2020/01/02 Javascript
javascript实现打砖块小游戏(附完整源码)
2020/09/18 Javascript
使用js获取身份证年龄的示例代码
2020/12/11 Javascript
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
python处理文本文件并生成指定格式的文件
2014/07/31 Python
Python验证码识别处理实例
2015/12/28 Python
python实现文本文件合并
2015/12/29 Python
Python装饰器实现几类验证功能做法实例
2017/05/18 Python
Python数据分析之双色球中蓝红球分析统计示例
2018/02/03 Python
Python打印“菱形”星号代码方法
2018/02/05 Python
一文秒懂python读写csv xml json文件各种骚操作
2019/07/04 Python
python基于FTP实现文件传输相关功能代码实例
2019/09/28 Python
Python实现中英文全文搜索的示例
2020/12/04 Python
使用Python爬取小姐姐图片(beautifulsoup法)
2021/02/11 Python
Space NK美国站:英国高端美妆护肤商城
2017/05/22 全球购物
Falconeri美国官网:由羊绒和羊毛制成的针织服装
2018/04/08 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
师范大学音乐表演专业求职信
2013/10/23 职场文书
委托书模板
2014/04/04 职场文书
事业单位工作人员年度考核个人总结
2015/02/12 职场文书