uniapp基于JSSDK 开发微信支付(php后端)

安装环境

html 复制代码
- NPM安装方式
npm install jweixin-module --save

重要文件jssdk.php

php 复制代码
<?php
class JSSDK {
  private $appId;
  private $appSecret;
  public function __construct($appId, $appSecret) {
    $this->appId = $appId;
    $this->appSecret = $appSecret;
  }
  public function getSignPackage() {
    $jsapiTicket = $this->getJsApiTicket();
    // 注意 URL 一定要动态获取,不能 hardcode.
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
    $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    $timestamp = time();
    $nonceStr = $this->createNonceStr();
    // 这里参数的顺序要按照 key 值 ASCII 码升序排序
    $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
    $signature = sha1($string);
    $signPackage = array(
      "appId"     => $this->appId,
      "nonceStr"  => $nonceStr,
      "timestamp" => $timestamp,
      "url"       => $url,
      "signature" => $signature,
      "rawString" => $string
    );
    return $signPackage; 
  }
  private function createNonceStr($length = 16) {
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    $str = "";
    for ($i = 0; $i < $length; $i++) {
      $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    }
    return $str;
  }
  private function getJsApiTicket() {
    // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例
    $data = json_decode($this->get_php_file(dirname(__FILE__) . "/jsapi_ticket.php"));
    if ($data->expire_time < time()) {
      $accessToken = $this->getAccessToken();
      // 如果是企业号用以下 URL 获取 ticket
      // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
      $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
      $res = json_decode($this->httpGet($url));
      $ticket = $res->ticket;
      if ($ticket) {
        $data->expire_time = time() + 7000;
        $data->jsapi_ticket = $ticket;
        $this->set_php_file(dirname(__FILE__) . "/jsapi_ticket.php", json_encode($data));
      }
    } else {
      $ticket = $data->jsapi_ticket;
    }
    return $ticket;
  }
  private function getAccessToken() {
  	//全局调用(防access_token过期)	
	global $access_token_mp;
	if(!$access_token_mp){
		return access_token_mp();
	}	
    return $access_token_mp;
	/*
    // access_token 应该全局存储与更新,以下代码以写入到文件中做示例
    $data = json_decode($this->get_php_file(dirname(__FILE__) . "/access_token.php"));
    if ($data->expire_time < time()) {
      // 如果是企业号用以下URL获取access_token
      // $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
      $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
      $res = json_decode($this->httpGet($url));
      $access_token = $res->access_token;
      if ($access_token) {
        $data->expire_time = time() + 7000;
        $data->access_token = $access_token;
        $this->set_php_file(dirname(__FILE__) . "/access_token.php", json_encode($data));
      }
    } else {
      $access_token = $data->access_token;
    }
    return $access_token;
	*/
  }
  private function httpGet($url) {
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_TIMEOUT, 500);
    // 为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
    // 如果在部署过程中代码在此处验证失败,请到 http://curl.haxx.se/ca/cacert.pem 下载新的证书判别文件。
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
    curl_setopt($curl, CURLOPT_URL, $url);
    $res = curl_exec($curl);
    curl_close($curl);
    return $res;
  }
  private function get_php_file($filename) {
    return trim(substr(file_get_contents($filename), 15));
  }
  private function set_php_file($filename, $content) {
    $fp = fopen($filename, "w");
    fwrite($fp, "<?php exit();?>" . $content);
    fclose($fp);
  }
}

JSSDK php获取配置

php 复制代码
include("jssdk.php");
//微信公众号AppID、AppSecret
$jssdk = new JSSDK(AppID, AppSecret);
$signPackage = $jssdk->GetSignPackage();
//回调传参
$infoArray["subjects"]["wxpalay"]["appId"] = $signPackage["appId"];
$infoArray["subjects"]["wxpalay"]["timestamp"] = $signPackage["timestamp"];
$infoArray["subjects"]["wxpalay"]["nonceStr"] = $signPackage["nonceStr"];
$infoArray["subjects"]["wxpalay"]["signature"] = $signPackage["signature"];

index.js文件

javascript 复制代码
var app = getApp()
var jWeixin = require('jweixin-module')
export default {
	name: 'index',
	data() {
		return {
			wxpalay: {}
		}
	},

	onLoad(options) {
		var that = this
		//加载配置信息,请求接口自己定义
		that.$https(that, {
			url: app.globalData.swtBase + "/h5/home.php?act=main",
			//data: formDatas,
			// downRefresh9: true,
			loading: true,
			//member: true,
			//  method: 'POST'
		}, function(that, data) {
			var mainDatas = data.subjects;
			that.wxpalay = mainDatas.wxpalay;
			//初始化微信支付配置
			if (mainDatas.wxpalay.appId) {
				// 配置 JSSDK
				jWeixin.config({
					debug: false,
					appId: mainDatas.wxpalay.appId,
					timestamp: mainDatas.wxpalay.timestamp,
					nonceStr: mainDatas.wxpalay.nonceStr,
					signature: mainDatas.wxpalay.signature,
					jsApiList: ['chooseWXPay']
				});

				jWeixin.error((res) => {
					console.log('JSSDK 配置失败', res);
				});
			}

		});

	},


	methods: {

        /**
		 * 发起微信下单接口
		 */
		onBindSubmitCallback: function(that, data) {
			var danhao = data.danhao;
			//去支付
			that.$https(that, {
				url: app.globalData.swtBase + "play.php",
				//data: ,
				// downRefresh9: true,
				loading: true,
				member: true,
				//  method: 'POST'
			}, that.paySuccessCallback);
		},

		//下单回调
		paySuccessCallback: function(that, data) {
			// 发起微信支付
			jWeixin.ready(() => {
				// 调起支付
				jWeixin.chooseWXPay({
					timestamp: data.subjects.timeStamp,
					nonceStr: data.subjects.nonceStr,
					package: data.subjects.package,
					signType: data.subjects.signType,
					paySign: data.subjects.paySign,
					success: (res) => {
						wx.hideLoading();
						util.showModal("支付成功,积分已到账。请进入小程序查看");
						that.userInfo.jifen = data.subjects.jifen;
					},
					fail: (res) => {
						console.error('支付失败', res);
						wx.hideLoading();
					}
				});
			});

		},

	}
}

play.php发起下单文件
参考下载链接:PHP微信支付V2

php 复制代码
<?php
$infoArray = array();
$infoArray["subjects"] = array();

include_once("wxpay/WxPayPubHelper/WxPayPubHelper.php");
$jsApi = new JsApi_pub();
$unifiedOrder = new UnifiedOrder_pub();
$unifiedOrder->setParameter("openid", $openid);
$unifiedOrder->setParameter("body", "" . $web_gz_wxapp . "_订单支付" . $ShopJine . "元_订单号:" . $rsDG["danhao"] . ""); //商品描述
$unifiedOrder->setParameter("out_trade_no", '支付单号');
$unifiedOrder->setParameter("total_fee", '支付金额');
$unifiedOrder->setParameter("notify_url", WxPayConf_pub::NOTIFY_URL);//回调通知地址
$unifiedOrder->setParameter("trade_type", "JSAPI");
$prepay_id = $unifiedOrder->getPrepayId();
//$infoArray["aa"] = $unifiedOrder;
$jsApi->setPrepayId($prepay_id);
$jsApiParameters = $jsApi->getParameters();
//$infoArray["bb"] = $jsApiParameters;
//合并数组
$payArray = json_decode($jsApiParameters, true);
$infoArray["subjects"] = array_merge($infoArray["subjects"], $payArray);
相关推荐
快乐的二进制鸭4 小时前
uniapp实现app的pdf预览
pdf·uni-app
qq_316837755 小时前
uniapp 打包安卓 集成高德地图
uni-app
阿福的工作室5 小时前
uniapp录制语音
uni-app
貂蝉空大8 小时前
uni-app开发app时 使用uni.chooseLocation遇到的问题
uni-app
林同学++8 小时前
uniapp多端适配
uni-app
kidding7238 小时前
uniapp引入uview组件库(可以引用多个组件)
前端·前端框架·uni-app·uview
qq_316837758 小时前
uniapp 安卓10+ 选择并上传文件
uni-app
合法的咸鱼8 小时前
uniapp 使用unplugin-auto-import 后, vue文件报红问题
前端·vue.js·uni-app
ianozo8 小时前
CTF 代码学习日记 PHP
java·学习·php
阳%12 小时前
uni-app小程序开发 基础知识2
前端·uni-app