微信小程序 支付功能实现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 相关文章推荐
如何获取JQUERY AJAX返回的JSON结果集实现代码
Dec 10 Javascript
jquery拖动插件(jquery.drag)使用介绍
Jun 18 Javascript
js中reverse函数的用法详解
Dec 26 Javascript
javascript jquery对form元素的常见操作详解
Jun 12 Javascript
Bootstrap popover用法详解
Dec 22 Javascript
Javascript设计模式之装饰者模式详解篇
Jan 17 Javascript
深入理解JavaScript创建对象的多种方式以及优缺点
Jun 01 Javascript
vue中的非父子间的通讯问题简单的实例代码
Jul 19 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
Oct 17 Javascript
在vue中使用el-tab-pane v-show/v-if无效的解决
Aug 03 Javascript
原生JavaScript实现换肤
Feb 19 Javascript
JavaScript实现简单拖拽效果
Sep 15 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与SQL注入攻击[二]
2007/04/17 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
PHP扩展CURL的用法详解
2014/06/20 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
获取body标签的两种方法
2011/10/13 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
2015/09/01 Javascript
高效Web开发的10个jQuery代码片段
2016/07/22 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
基于vue2.0+vuex的日期选择组件功能实现
2017/03/13 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
bootstrap fileinput实现文件上传功能
2017/08/23 Javascript
5 种JavaScript编码规范
2018/01/30 Javascript
JS 实现分页打印功能
2018/05/16 Javascript
vue.js高德地图实现热点图代码实例
2019/04/18 Javascript
微信小程序使用Vant Weapp组件库的方法步骤
2019/08/01 Javascript
JavaScript遍历数组的方法代码实例
2020/01/14 Javascript
如何实现vue的tree组件
2020/12/03 Vue.js
python多重继承新算法C3介绍
2014/09/28 Python
Python通过select实现异步IO的方法
2015/06/04 Python
Python 3中的yield from语法详解
2017/01/18 Python
Python中防止sql注入的方法详解
2017/02/25 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
Django-xadmin+rule对象级权限的实现方式
2020/03/30 Python
Python pandas如何向excel添加数据
2020/05/22 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
德国网上花店:Valentins
2018/08/15 全球购物
StudentUniverse英国:学生航班、酒店和旅游
2019/08/25 全球购物
Agoda中文官网:安可达(低价预订全球酒店)
2021/01/18 全球购物
《草原》教学反思
2014/02/15 职场文书
参观接待方案
2014/03/17 职场文书
《夕阳真美》教学反思
2014/04/27 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
迎新生欢迎词2015
2015/07/16 职场文书
关于教师节的广播稿
2015/08/19 职场文书
社区挂职锻炼个人工作总结
2015/10/23 职场文书
教你怎么用Python实现GIF动图的提取及合成
2021/06/15 Python