微信小程序 支付功能实现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中怎样判断undefined(比较不错的方法)
Mar 27 Javascript
Highcharts使用简例及异步动态读取数据
Dec 30 Javascript
jQuery隐藏和显示效果实现
Apr 06 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
Dec 18 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
Feb 20 Javascript
利用ES6语法重构React组件详解
Mar 02 Javascript
JavaScript设计模式之构造函数模式实例教程
Jul 02 Javascript
vue 使用vue-i18n做全局中英文切换的方法
Oct 29 Javascript
微信小程序位置授权处理方法
Jun 13 Javascript
Layui数据表格之单元格编辑方式
Oct 26 Javascript
Js on及addEventListener原理用法区别解析
Jul 11 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
Nov 07 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
Zend Studio (eclipse)使用速度优化方法
2011/03/23 PHP
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
2015/02/12 PHP
php实现给一张图片加上水印效果
2016/01/02 PHP
php防止sql注入的方法详解
2017/02/20 PHP
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
extjs ColumnChart设置不同的颜色实现代码
2013/05/17 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
2013/06/02 Javascript
jquery获取tagName再进行判断
2014/05/29 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
初识Node.js
2015/03/20 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
Bootstrap多级导航栏(级联导航)的实现代码
2016/03/08 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
2017/04/13 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
JS Object.preventExtensions(),Object.seal()与Object.freeze()用法实例分析
2018/08/25 Javascript
vue实践---根据不同环境,自动转换请求的url地址操作
2020/09/21 Javascript
JavaScript实现点击出现子菜单效果
2021/02/08 Javascript
[02:15]你好,这就是DOTA!
2015/08/05 DOTA
Python pass 语句使用示例
2014/03/11 Python
Python网站验证码识别
2016/01/25 Python
解决python nohup linux 后台运行输出的问题
2018/05/11 Python
python中的split()函数和os.path.split()函数使用详解
2019/12/21 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
容易被忽略的Python内置类型
2020/09/03 Python
Django model class Meta原理解析
2020/11/14 Python
在python中对于bool布尔值的取反操作
2020/12/11 Python
欧洲最古老的鞋厂:Peter Kaiser
2019/11/05 全球购物
医疗纠纷协议书
2014/04/16 职场文书
行政专员求职信范文
2014/05/03 职场文书
2014年国庆节寄语
2014/09/19 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
广播体操比赛主持词
2015/06/29 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL