微信小程序 支付功能实现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 相关文章推荐
通过MSXML2自动获取QQ个人头像及在线情况(给初学者)
Jan 22 Javascript
JavaScript 动态创建VML的方法
Oct 14 Javascript
强大的jquery插件jqeuryUI做网页对话框效果!简单
Apr 14 Javascript
jQuery实现拖拽效果插件的方法
Mar 23 Javascript
jQuery实现新消息在网页标题闪烁提示
Jun 23 Javascript
jquery淡入淡出效果简单实例
Jan 14 Javascript
详解JavaScript的AngularJS框架中的作用域与数据绑定
Mar 04 Javascript
jQuery实现边框动态效果的实例代码
Sep 23 Javascript
require、backbone等重构手机图片查看器
Nov 17 Javascript
javascript中href和replace的比较(详解)
Nov 25 Javascript
基于Bootstrap table组件实现多层表头的实例代码
Sep 07 Javascript
vue element-ui实现input输入框金额数字添加千分位
Dec 29 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_soap实现http连接安全认证的php代码
2011/01/12 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
Use Word to Search for Files
2007/06/15 Javascript
页面调用单个swf文件,嵌套出多个方法。
2011/11/21 Javascript
js实现的切换面板实例代码
2013/06/17 Javascript
固定网页背景图同时保持图片比例的思路代码
2013/08/15 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
JavaScript String(字符串)对象的简单实例(推荐)
2016/08/31 Javascript
原生JS实现自定义滚动条效果
2020/10/27 Javascript
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
React中阻止事件冒泡的问题详析
2019/04/12 Javascript
JS解惑之Object中的key是有序的么
2019/05/06 Javascript
nodejs中实现修改用户路由功能
2019/05/24 NodeJs
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
[01:32]完美世界DOTA2联赛10月29日精彩集锦
2020/10/30 DOTA
Python实现的简单发送邮件脚本分享
2014/11/07 Python
django反向解析和正向解析的方式
2018/06/05 Python
python正则-re的用法详解
2019/07/28 Python
关于pycharm中pip版本10.0无法使用的解决办法
2019/10/10 Python
Windows下Anaconda和PyCharm的安装与使用详解
2020/04/23 Python
css3实现超炫风车特效
2014/11/12 HTML / CSS
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
英国汽车座椅和婴儿车购物网站:Uber Kids
2017/04/19 全球购物
精致的手工皮鞋:Shoe Embassy
2019/11/08 全球购物
护理学毕业生自荐信
2013/10/02 职场文书
传播学专业毕业生自荐信
2013/11/04 职场文书
春节联欢会策划方案
2014/05/16 职场文书
圣诞节活动策划方案
2014/06/09 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
培训师岗位职责
2015/02/14 职场文书
关于召开会议的通知
2015/04/15 职场文书
2016护理专业求职自荐书
2016/01/28 职场文书
导游词之南京栖霞山
2019/10/18 职场文书
python基于opencv批量生成验证码的示例
2021/04/28 Python
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang