微信小程序 支付功能实现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 关于=+与+=日期函数使用说明(赋值运算符)
Nov 15 Javascript
JS TextArea字符串长度限制代码集合
Oct 31 Javascript
JS 获取浏览器和屏幕宽高等信息代码
Mar 31 Javascript
jQuery实现强制cookie过期方法汇总
May 22 Javascript
AngualrJS中每次$http请求时的一个遮罩层Directive
Jan 26 Javascript
JavaScript中循环遍历Array与Map的方法小结
Mar 12 Javascript
Javascript删除指定元素节点的方法
Jun 21 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
Jun 22 Javascript
浅析从vue源码看观察者模式
Jan 29 Javascript
记React connect的几种写法(小结)
Sep 18 Javascript
node爬取新型冠状病毒的疫情实时动态
Feb 06 Javascript
JS数组转字符串实现方法解析
Sep 04 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
Zerg建筑一览
2020/03/14 星际争霸
Terran兵种对照表
2020/03/14 星际争霸
php+mysqli数据库连接的两种方式
2015/01/28 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
web前端开发也需要日志
2010/12/09 Javascript
关于全局变量和局部变量的那些事
2013/01/11 Javascript
addEventListener()第三个参数useCapture (Boolean)详细解析
2013/11/07 Javascript
jquery实现弹出窗口效果的实例代码
2013/11/28 Javascript
页面元素绑定jquery toggle后元素隐藏的解决方法
2014/03/27 Javascript
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
JavaScript转换二进制编码为ASCII码的方法
2015/04/16 Javascript
JavaScript中指定函数名称的相关方法
2015/06/04 Javascript
Javascript连接Access数据库完整实例
2015/08/03 Javascript
Bootstrap中的Panel和Table全面解析
2016/06/13 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
2017/08/23 Javascript
12个提高JavaScript技能的概念(小结)
2019/05/09 Javascript
微信小程序云开发如何使用npm安装依赖
2019/05/18 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
ant-design-vue 实现表格内部字段验证功能
2019/12/16 Javascript
浅谈javascript事件环微任务和宏任务队列原理
2020/09/12 Javascript
npm ci命令的基本使用方法
2020/09/20 Javascript
使用PyCharm进行远程开发和调试的实现
2019/11/04 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
美国羽绒床上用品第一品牌:Pacific Coast
2018/08/25 全球购物
我的applet原先好好的, 一放到web server就会有问题,为什么?
2016/05/10 面试题
实习生自荐信范文
2013/11/13 职场文书
运动会通讯稿150字
2014/02/15 职场文书
殡葬服务心得体会
2014/09/11 职场文书
作风转变年心得体会
2014/10/22 职场文书
四风问题原因分析及整改措施
2014/10/24 职场文书
酒店前台接待岗位职责
2015/04/02 职场文书
2015小学教师年度工作总结
2015/05/12 职场文书