欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > uniapp基于JSSDK 开发微信支付(php后端)

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

2025/2/22 2:06:50 来源:https://blog.csdn.net/weixin_44936767/article/details/145737612  浏览:    关键词:uniapp基于JSSDK 开发微信支付(php后端)

安装环境

- NPM安装方式
npm install jweixin-module --save


重要文件jssdk.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获取配置

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文件
 

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) {// 配置 JSSDKjWeixin.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
$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);

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词