盐城网站建设 -> 信息中心 -> CMS教程 -> 齐博cms

手把手教你如何对接齐博cms的php页面跳转到小程序支付

日期:2019-04-20 12:07:59 阅读:100次 【 字体:

小程序界面里面的app.js

主要是获取支付需要的openid

//app.js
App({
  onLaunch: function () {
    // 展示本地存储能力
    var logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)
    // 登录
    wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
        if (res.code) {
          //发起网络请求
          wx.request({
            url: 'http://www.yaft.icu/inc/olpay/wxxcxpay.php?type=openid',
            data: {
              appid:'***',//自己的小程序APPID
              appsecret:'***',//自己的小程序appsecret
              code: res.code
            },
            method: 'POST',
            header: {
              'content-type': 'application/x-www-form-urlencoded'
            },
            success: function (response) {
              var obj = {};
              obj.openid = response.data.openid;
              wx.setStorageSync('user', obj.openid);//存储openid
            //  console.log(obj.openid);
            }
          })
        } else {
          console.log('获取用户登录态失败!' + res.errMsg)
        }
      }
      
    })
    // 获取用户信息
    wx.getSetting({
      success: res => {
        if (res.authSetting['scope.userInfo']) {
          // 已经授权,可以直接调用 getUserInfo 获取头像昵称,?#25442;?#24377;框
          wx.getUserInfo({
            success: res => {
              // 可以将 res 发送给后台解码出 unionId
              this.globalData.userInfo = res.userInfo
              // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
              // 所以此处加入 callback 以防止这种情况
              if (this.userInfoReadyCallback) {
                this.userInfoReadyCallback(res)
              }
            }
          })
        }
      }
    })
  },
  globalData: {
    userInfo: null
  }
})

小程序里面的支付页面,主要是调起支付界面,同时向h5 的php页面发生订单号并获取信息,用于支付。

// pages/wxPay/wxPay.js
Page({
  onLoad: function (options) {
    var that = this;
    that.setData({
      num_code: options.numcode,
      money: options.money
    })
    console.log(that.data.body)//订单号
    var useropenid = wx.getStorageSync('user') || []
    console.log(useropenid);
    wx.request({
      url: 'http://www.yaft.icu/inc/olpay/wxxcxpay.php?type=xiadan',
      data: {
        'useropenid': useropenid,
        'num_code': options.numcode,
        'money': options.money
      },
      method: 'POST',
      header: {
        'content-type': 'application/x-www-form-urlencoded'
      },
      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)
      }
    })
  }
})

下面是涉及到的wxxcxpay.php内容,注意这个不是小程序的页面而是外部h5的页面。

这个页面是齐博cms二次开发的界面,所以里面有些函数都是基于这个cms的,应该好理解。前端下单的界面就不发了,可以把下面的几个变量改成固定的数字就可以直接测试了。

这个页面主要是点击支付跳转到小程序内部的页面,注意看最下面的js,其中有一个/pages/wxpay/wxpay 这样就是小程序的支付页面。

<?php 
if($_GET[numcode]){
$rt = $db->get_one("SELECT * FROM {$pre}olpay WHERE numcode='$_GET[numcode]'");
if(!$rt){
die('?#20302;?#20013;没?#24515;?#30340;订单,无法完成支付!001');
}
if($rt['ifpay'] == 1){
olpay_end($rt[numcode]);
}else{
die('该订单还未完成充值!001');
}
}elseif($_GET[type]=='openid'){
function https_request($url){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl,  CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);  
$data = curl_exec($curl);
if (curl_errno($curl)){
return 'ERROR';
}
curl_close($curl);
return $data;
}
$code= $_POST[code];
$appid= $_POST[appid];
$appsecret= $_POST[appsecret];
$access_url = "https://api.weixin.qq.com/sns/jscode2session?appid=".$appid."&secret=".$appsecret."&js_code=".$code."&grant_type=authorization_code";
$str = https_request($access_url);
print_r($str);
}elseif($_GET[type]=='xiadan'){
require(dirname(dirname(dirname(__FILE__)))."/do/weixinpay/lib/WxPay.Api.php");
require(dirname(dirname(dirname(__FILE__)))."/do/weixinpay/lib/WxPay.xiaochengxu.php");
$appid='********';//自?#20309;?#20449;支付里面有
$openid= $_POST[useropenid];
$mch_id='********';//微信支付里面有
$key='********';//自己设置的微信商家key
$out_trade_no = $_POST[num_code];//?#25945;?#20869;部订单号
$total_fee = $_POST[money] * 100; //金额
$body = '在线付款';
$weixinpay = new WeixinPay($appid,$openid,$mch_id,$key,$out_trade_no,$body,$total_fee);
$return=$weixinpay->pay();
echo json_encode($return);
}else{
list($type,$atc_moeny,$numcode,$mid)=explode("\t",mymd5($pay_code,'DE'));
$array=olpay_send();
echo '<html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>微信小程序支付</title></head><body><div align="center"><div style="font-size:14px; color:#999; margin-top:50px;">当前订单的金额为</div><div style="color:#333;font-size:50px; margin-top:10px;">¥ '.$array[money].'</div><button style="width:250px; height:50px; border-radius: 15px;background-color:#45C01A; border:0px #FE6714 solid; cursor: pointer;  color:white;  font-size:16px; margin-top:30px;" type="button" id="getBrandWCPayRequests" onclick="javascript:pay()">立即支付</button></div><script src="'.$webdb[www_url].'/images/mengbo/jweixin-1.3.2.js" type="text/javascript"></script><script>function pay(){var params = "?numcode='.$array[numcode].'&money='.$array[money].'";var path = "/pages/wxpay/wxpay"+params;wx.miniProgram.navigateTo({url: path});}</script></body></html>';
}
?>

上面这个php里面还包含了两个php文件,WxPay.Api.php 这个官方的sdk里面有,里面要对应配置下。

WxPay.xiaochengxu.php这个文件内容如下:

<?php
 
 
/*
 * 小程序微信支付
 */
 
 
class WeixinPay {
 
 
    protected $appid;
    protected $mch_id;
    protected $key;
    protected $openid;
    protected $out_trade_no;
    protected $body;
    protected $total_fee;
            function __construct($appid, $openid, $mch_id, $key,$out_trade_no,$body,$total_fee) {
        $this->appid = $appid;
        $this->openid = $openid;
        $this->mch_id = $mch_id;
        $this->key = $key;
        $this->out_trade_no = $out_trade_no;
        $this->body = $body;
        $this->total_fee = $total_fee;
    }
 
 
    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' => 'test', //商品描述
            'body' => $this->body,
//            'out_trade_no' => '2015450806125348', //商户订单号
            'out_trade_no'=> $this->out_trade_no,
//            'total_fee' => floatval(0.01 * 100), //总金额 单位 分
            'total_fee' => $this->total_fee,
//            'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], //终端IP
            'spbill_create_ip' => '192.168.0.161', //终端IP
            'notify_url' => 'http://www.yaft.icu/do/wxpay_notify.php', //异步通知地址  确保外网能正常?#26790;?
            'openid' => $this->openid, //用户id
            'trade_type' => 'JSAPI'//交易类型
        );
        //统一下单签名
        $parameters['sign'] = $this->getSign($parameters);
        $xmlData = $this->arrayToXml($parameters);
        $return = $this->xmlToArray($this->postXmlCurl($xmlData, $url, 60));
        return $return;
    }
 
 
    private static function postXmlCurl($xml, $url, $second = 30) 
    {
        $ch = curl_init();
        //设置超时
        curl_setopt($ch, CURLOPT_TIMEOUT, $second);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //严格校验
        //设置header
        curl_setopt($ch, CURLOPT_HEADER, FALSE);
        //要求结果为字符串且输出到屏幕上
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        //post提交方式
        curl_setopt($ch, CURLOPT_POST, TRUE);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
 
 
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
        curl_setopt($ch, CURLOPT_TIMEOUT, 40);
        set_time_limit(0);
 
 
        //运行curl
        $data = curl_exec($ch);
        //返回结果
        if ($data) {
            curl_close($ch);
            return $data;
        } else {
            $error = curl_errno($ch);
            curl_close($ch);
            throw new WxPayException("curl出错,错误码:$error");
        }
    }
    
    
    
    //数组转换成xml
    private function arrayToXml($arr) {
        $xml = "<root>";
        foreach ($arr as $key => $val) {
            if (is_array($val)) {
                $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";
            } else {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
            }
        }
        $xml .= "</root>";
        return $xml;
    }
 
 
    //xml转换成数组
    private function xmlToArray($xml) {
 
 
        //禁止引用外部xml实体 
 
 
        libxml_disable_entity_loader(true);
 
 
        $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
 
 
        $val = json_decode(json_encode($xmlstring), true);
 
 
        return $val;
    }
 
 
    //微信小程序接口
    private function weixinapp() {
        //统一下单接口
        $unifiedorder = $this->unifiedorder();
//        print_r($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?#29992;?
        $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;
    }
 
 
}

主要涉及的文件就这么多。

暂无...


上一篇:没有了
下一篇:齐博CMSV7 辅栏目样式在哪里修改?
最新文章
会员 客服 QQ 电话 充值 工单
Top

24小时客服热线

0515-87213010

18036323215

多特vs奥格斯堡
mg4355电子游戏线路检测 精准计划软件客户端 北京pk10全天7吗计划 时时彩技巧心得体会 中国福中心老时时 赌pc稳赢方法 360老时时杀号 博彩怎么玩 齐齐乐捕鱼(红包版) 北京冠军赛车6码倍投 扑克21点要牌技巧 大小单双单期技巧 重庆时时全天计划网页版 谁有北京pk10计划群 pc蛋蛋28预测到 百人牛牛押注几门稳