微信小程序 支付功能实现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 比较时间大小的代码
Apr 24 Javascript
juqery 学习之四 筛选过滤
Nov 30 Javascript
js实现上传图片之上传前预览图片
Mar 25 Javascript
jquery等宽输出文字插件使用介绍
Sep 18 Javascript
详解Bootstrap插件
Apr 25 Javascript
flag和jq on 的绑定多个对象和方法(必看)
Feb 27 Javascript
vue滚动固定顶部及修改样式的实例代码
May 30 Javascript
关于layui 弹出层一闪而过就消失的解决方法
Sep 09 Javascript
react实现同页面三级跳转路由布局
Sep 26 Javascript
js实现浏览器打印功能的示例代码
Jul 15 Javascript
解决Vue项目中tff报错的问题
Oct 21 Javascript
jQuery实现动态向上滚动
Dec 21 jQuery
深入理解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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
微信公众平台开发实现2048游戏的方法
2015/04/15 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
jquery 经典动画菜单效果代码
2010/01/26 Javascript
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
40个有创意的jQuery图片、内容滑动及弹出插件收藏集之一
2011/12/31 Javascript
用js判断页面是否加载完成实现代码
2012/12/11 Javascript
js 判断一个元素是否在页面中存在
2012/12/27 Javascript
解决jquery插件冲突的问题
2014/01/23 Javascript
javascript正则表达式使用replace()替换手机号的方法
2015/01/19 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
js实现input密码框提示信息的方法(附html5实现方法)
2016/01/14 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
AngularJS中$http的交互问题
2017/03/29 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
Angularjs验证用户输入的字符串是否为日期时间
2017/06/01 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
2017/10/21 Javascript
使用ng-packagr打包Angular的方法示例
2018/09/21 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
vue点击标签切换选中及互相排斥操作
2020/07/17 Javascript
JavaScript 如何在浏览器中使用摄像头
2020/12/02 Javascript
[17:13]DOTA2 HEROS教学视频教你分分钟做大人-斯拉克
2014/06/13 DOTA
Python设计模式之抽象工厂模式
2016/08/25 Python
梅尔频率倒谱系数(mfcc)及Python实现
2019/06/18 Python
pandas 强制类型转换 df.astype实例
2020/04/09 Python
解决阿里云邮件发送不能使用25端口问题
2020/08/07 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
New Balance德国官方网站:购买鞋子和服装
2019/08/31 全球购物
国际贸易专业个人求职信格式
2014/02/02 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
《飞向蓝天的恐龙》教学反思
2014/04/09 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
工作检讨书大全
2015/01/26 职场文书
2015年度招聘工作总结
2015/05/28 职场文书
创业者如何撰写出一份打动投资人的商业计划书?
2019/07/02 职场文书
Nginx+Tomcat负载均衡多实例详解
2022/04/11 Servers