微信小程序 支付功能实现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 相关文章推荐
最新的10款jQuery内容滑块插件分享
Sep 18 Javascript
document.documentElement的一些使用技巧
Apr 18 Javascript
JS中的THIS和WINDOW.EVENT.SRCELEMENT详解
May 25 Javascript
javascript多物体运动实现方法分析
Jan 08 Javascript
JS生成和下载二维码的代码
Dec 07 Javascript
jquery ajax异步提交表单数据的方法
Oct 27 jQuery
vue组件jsx语法的具体使用
May 21 Javascript
JavaScript中 ES6变量的结构赋值
Jul 10 Javascript
js 计算图片内点个数的示例代码
Apr 04 Javascript
解决Vue-Router升级导致的Uncaught (in promise)问题
Aug 07 Javascript
解决Element中el-date-picker组件不回填的情况
Nov 07 Javascript
Vue.extend 登录注册模态框的实现
Dec 29 Vue.js
深入理解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
vBulletin HACK----关于排版的两个HACK
2006/10/09 PHP
MySql 按时间段查询数据方法(实例说明)
2008/11/02 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
php实现简单洗牌算法
2013/06/18 PHP
csdn 论坛技术区平均给分功能
2009/11/07 Javascript
javascript两种function的定义介绍及区别说明
2013/05/02 Javascript
js过滤HTML标签以及空格的思路及代码
2013/05/24 Javascript
jquery创建表格(自动增加表格)代码分享
2013/12/25 Javascript
js实现表格字段排序
2014/02/19 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
2015/06/23 Javascript
jquery-tips悬浮提示插件分享
2015/07/31 Javascript
JavaScript如何获取数组最大值和最小值
2015/11/18 Javascript
基于jquery实现表格内容筛选功能实例解析
2016/05/09 Javascript
详解JavaScript中|单竖杠运算符的使用方法
2016/05/23 Javascript
下一代Bootstrap的5个特点 超酷炫!
2016/06/17 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
JavaScript取得gridview中获取checkbox选中的值
2017/07/24 Javascript
Vue列表页渲染优化详解
2017/07/24 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
vue两个组件间值的传递或修改方式
2018/07/04 Javascript
小程序自定义组件实现城市选择功能
2018/07/18 Javascript
基于JS实现前端压缩上传图片的实例代码
2019/05/14 Javascript
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
初步理解Python进程的信号通讯
2015/04/09 Python
python检测空间储存剩余大小和指定文件夹内存占用的实例
2018/06/11 Python
Python中修改字符串的四种方法
2018/11/02 Python
python实现各种插值法(数值分析)
2019/07/30 Python
python中的global关键字的使用方法
2019/08/20 Python
Python运行异常管理解决方案
2020/03/09 Python
基于python实现MQTT发布订阅过程原理解析
2020/07/27 Python
公共场所禁烟标语
2014/06/25 职场文书
考试作弊检讨书
2014/10/21 职场文书
2014年党委工作总结
2014/11/22 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
李白经典诗之一:全文无一“月”字,却句句有月
2019/07/12 职场文书