微信小程序 支付功能实现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 相关文章推荐
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
Aug 02 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
Nov 29 Javascript
JavaScript中实现单体模式分享
Jan 29 Javascript
JavaScript Length 属性的总结
Nov 02 Javascript
js+html5实现的自由落体运动效果代码
Jan 28 Javascript
javascript每日必学之封装
Feb 23 Javascript
ionic 上拉菜单(ActionSheet)实例代码
Jun 06 Javascript
Angular 4.X开发实践中的踩坑小结
Jul 04 Javascript
微信小程序 页面跳转传值实现代码
Jul 27 Javascript
微信小程序基础教程之worker线程的使用方法
Jul 15 Javascript
微信小程序嵌入腾讯视频源过程详解
Aug 08 Javascript
Vue实现input宽度随文字长度自适应操作
Jul 29 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
239军机修复记
2021/03/02 无线电
PHP编码规范之注释和文件结构说明
2010/07/09 PHP
php preg_replace替换实例讲解
2013/11/04 PHP
PHP入门教程之表单与验证实例详解
2016/09/11 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
javascript 特殊字符串
2009/02/25 Javascript
jquery.validate 自定义验证方法及validate相关参数
2016/01/18 Javascript
JS实现的在线调色板实例(附demo源码下载)
2016/03/01 Javascript
Boostrap基础教程之JavaScript插件篇
2016/09/08 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
2016/10/27 Javascript
纯JS实现图片验证码功能并兼容IE6-8(推荐)
2017/04/19 Javascript
jQuery+C#实现参数RSA加密传输功能【附jsencrypt.js下载】
2017/06/26 jQuery
详解浏览器缓存和webpack缓存配置
2018/07/06 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
pageGroup.js实现分页功能
2019/07/27 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
[02:21]DOTA2英雄基础教程 蝙蝠骑士
2013/12/16 DOTA
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
python正则表达式抓取成语网站
2013/11/20 Python
Python中实现结构相似的函数调用方法
2015/03/10 Python
python中偏函数partial用法实例分析
2015/07/08 Python
python使用logging模块发送邮件代码示例
2018/01/18 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
Python的numpy库下的几个小函数的用法(小结)
2019/07/12 Python
pip指定python位置安装软件包的方法
2019/07/12 Python
python实现ssh及sftp功能(实例代码)
2020/03/16 Python
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
中专生自我鉴定书范文
2013/12/28 职场文书
小学六年级学生评语
2014/04/22 职场文书
家长会学生演讲稿
2014/04/26 职场文书
企业职业病防治方案
2014/05/29 职场文书
项目经理任命书
2014/06/04 职场文书
四风问题对照检查材料思想汇报
2014/10/07 职场文书
2014年科协工作总结
2014/12/09 职场文书