PHP服务商微信支付分支付(需确认模式)

//查询支付分是否支付
public function serviceorderServiceorder($out_order_no)
{$setting = [];$service_id = $setting['service_id'];$sub_mchid = $setting['mchid'];$ps = "/v3/payscore/partner/serviceorder?service_id=${service_id}&sub_mchid=${sub_mchid}&out_order_no=${out_order_no}";$url = "https://api.mch.weixin.qq.com" . $ps;$header = $this->getV3Sign('GET', $ps, "", $setting);$res = $this->curl_post($url, [], $header, false);$result = json_decode($res, true);if ($result['state'] == "DONE") {$need_collection = true;} else {$need_collection = false;}$transaction_id = $result['collection']['details'][0]['transaction_id'] ?? "";$state = $result['state'];return compact('state', 'need_collection', 'transaction_id');}//完成信用分订单
public function completeServiceorder($data)
{$setting = [];$data['money'] = (int)bcmul($data['money'], 100, 0);$out_order_no = $data['order_no'];$service_id = $setting['service_id'];$sub_mchid = $setting['mchid'];$post_payments = [['name' => '付款','amount' => $data['money']]];$time_range = ['end_time' => date('Ymd', time())];$total_amount = $data['money'];$url = "https://api.mch.weixin.qq.com/v3/payscore/partner/serviceorder/" . $out_order_no . "/complete";$arr = ['service_id' => $service_id,'sub_mchid' => $sub_mchid,'post_payments' => $post_payments,'total_amount' => $total_amount,'time_range' => $time_range];$arr = json_encode($arr);$header = $this->getV3Sign('POST', "/v3/payscore/partner/serviceorder/" . $out_order_no . "/complete", $arr, $setting);$res = $this->curl_post($url, $arr, $header);$result = json_decode($res, true);if (isset($result['message']) && $result['message']) {\think\Log::error($result['message'] . "_" . $data['order_no']);return false;}return true;}//取消信用分订单
public function cancelServiceorder($out_order_no)
{$setting = [];$service_id = $setting['service_id'];$sub_mchid = $setting['mchid'];$reason = "用户取消";$arr = ['service_id' => $service_id,'sub_mchid' => $sub_mchid,'reason' => $reason];$url = "https://api.mch.weixin.qq.com/v3/payscore/partner/serviceorder/{$out_order_no}/cancel";$arr = json_encode($arr);$header = $this->getV3Sign('POST', "/v3/payscore/partner/serviceorder/{$out_order_no}/cancel", $arr, $setting);$res = $this->curl_post($url, $arr, $header);$result = json_decode($res, true);return $result;
}//创建信用分订单
public function addServiceorder($data)
{$setting = [];//数组数据$service_id = $setting['service_id'];$appid = $setting['main_gzh_app_id'];$sub_appid = $setting['gzh_app_id'];$sub_mchid = $setting['mchid'];$out_order_no = $data['order_no'];$service_introduction = "付款";//描述$risk_fund = ['name' => 'ESTIMATE_ORDER_COST','amount' => 10000];$time_range = ['start_time' => date('Ymd', time())];$notify_url = $setting['zfj_notify_url'] ?? "";$arr = ['sub_appid' => $sub_appid,'service_id' => $service_id,'appid' => $appid,'sub_mchid' => $sub_mchid,'out_order_no' => $out_order_no,'service_introduction' => $service_introduction,'risk_fund' => $risk_fund,'time_range' => $time_range,'notify_url' => $notify_url,'need_user_confirm' => true];$url = "https://api.mch.weixin.qq.com/v3/payscore/partner/serviceorder";$arr = json_encode($arr);$header = $this->getV3Sign('POST', '/v3/payscore/partner/serviceorder', $arr, $setting);$res = $this->curl_post($url, $arr, $header);$result = json_decode($res, true);if (isset($result['message']) && $result['message']) {throw new BaseException(['msg' => 'message: ' . $result['message']]);}$timestamp = time();$nonce_str = getRandom(32);//随机串$js_arr = ['sign_type' => 'HMAC-SHA256','mch_id' => $result['mchid'],'package' => $result['package'],'timestamp' => $timestamp,'nonce_str' => $nonce_str];$sign = $this->makeSign($js_arr, $setting['v3_apikey']);$js_arr['sign'] = $sign;ksort($js_arr);$js_arr = $this->toUrlParams($js_arr);$a_s = ['order_id' => $result['order_id'],'out_order_no' => $result['out_order_no'],'package' => $result['package'],'cont' => $js_arr];return $a_s;
}/*** 格式化参数格式化成url参数* @param $values* @return string*/
public function toUrlParams($values)
{$buff = '';foreach ($values as $k => $v) {if ($k != 'sign' && $v != '' && !is_array($v)) {$buff .= $k . '=' . $v . '&';}}return trim($buff, '&');
}/*** 生成签名* @param $values* @return string 本函数不覆盖sign成员变量,如要设置签名需要调用SetSign方法赋值*/
public function makeSign($values, $key = null)
{//签名步骤一:按字典序排序参数ksort($values);$string = $this->toUrlParams($values);//签名步骤二:在string后加入KEY$string = $string . '&key=' . $key;$string = md5($string);$string = hash_hmac("sha256", $string, $key);//签名步骤四:所有字符转为大写$result = strtoupper($string);return $result;
}public function getV3Sign($http_method = 'POST', $url = '', $body = '', $config)
{$mch_private_key = $config['key_pem'];$timestamp = time();//时间戳$nonce = getRandom(32);//随机串//构造签名串$message = $http_method . "\n" . $url . "\n" . $timestamp . "\n" . $nonce . "\n" . $body . "\n";//计算签名值openssl_sign($message, $raw_sign, $mch_private_key, 'SHA256');$sign = base64_encode($raw_sign);
//        echo $message;
//        echo "<br />";
//        echo $sign;exit;//设置HTTP头$token = sprintf('WECHATPAY2-SHA256-RSA2048 mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',$config['main_mchid'], $nonce, $timestamp, $config['serial_no'], $sign);$headers = ['Accept: application/json','User-Agent: */*','Content-Type: application/json; charset=utf-8','Authorization: ' . $token,];return $headers;
}

Index.php

//免密自动支付
public function index()
{$order_no = "订单号";$rts = (new WxGzhPay())->addServiceorder(['order_no' => $order_no]);$wx_js = "";//微信js参数$this->assign('wx_js', $wx_js);$this->assign('queryString', $rts);	return view();}

html部分代码

wx.config({debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: '{$wx_js["appID"]}', // 必填,公众号的唯一标识timestamp: '{$wx_js["timestamp"]}', // 必填,生成签名的时间戳nonceStr: '{$wx_js["noncestr"]}', // 必填,生成签名的随机串signature: '{$wx_js["signature"]}',// 必填,签名jsApiList: ['openBusinessView'] // 必填,需要使用的JS接口列表
});let wechatInfo = navigator.userAgent.match(/MicroMessenger\/([\d\.]+)/i);
let wechatVersion = wechatInfo[1];
if (compareVersion(wechatVersion, '7.0.5') >= 0) {goToWXScore();
} else {// 提示用户升级微信客户端版本window.href = 'https://support.weixin.qq.com/cgi-bin/readtemplate?t=page/common_page__upgrade&text=text005&btn_text=btn_text_0'
}let az_type = 1if(/android/i.test(navigator.userAgent)){az_type = 1}if(/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)){az_type = 2}function goToWXScore() {wx.ready(()=>{wx.checkJsApi({jsApiList: ['openBusinessView'], // 需要检测的JS接口列表success: function (res) {if (res.checkResult.openBusinessView) {wx.invoke('openBusinessView', {businessType: 'wxpayScoreUse',queryString: 'package={$queryString["package"]}'},function (res) {if(az_type==1){if (parseInt(res.err_code) === 0) {let r = JSON.parse(res.extraData)if(!r.query_id){//成功}else {//失败}} else {//失败}}else{let the_code = JSON.stringify(res['err_code'])// 从微信侧小程序返回时会执行这个回调函数if (parseInt(the_code) === 0) {let r = JSON.stringify(res.extraData)if(r=="{}"){//失败}else {//成功}} else {//失败}}});}}});})}

正常的话会跳入此页面
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/473047.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【自然语言处理】实验3,文本情感分析

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;只展示主要任务实验结果&#xff0c;如果需要详细的实验报告或者代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢…

Java 学习和实践笔记(12)

这个就比较有意思了&#xff01;所有的事情&#xff0c;拆分完之后&#xff0c;都有且只有这三种状态流程&#xff01; //TIP To <b>Run</b> code, press <shortcut actionId"Run"/> or // click the <icon src"AllIcons.Actions.Execute&…

LGAMEFI基于BPL公链开发的第一生态:开启RWA游戏娱乐与DeFi融合的新纪元

在去中心化金融&#xff08;DeFi&#xff09;与游戏娱乐的结合趋势中&#xff0c;BPL公链上的LGAMEFI项目代表了前沿的技术革新和市场领导。这种将web2上成熟页游进行RWA链改&#xff0c;不仅仅是将游戏热门领域融合&#xff0c;更是在寻找一种全新的参与者经验&#xff0c;将玩…

archLinux安装记录

archLinux安装记录 基于wsl的arch 启用wsl 首先&#xff0c;按Win S搜索启用或关闭Windows功能&#xff08;Turn Windows features on or off&#xff09;,打开虚拟机平台和WSL&#xff0c;并重启Windows。 重启后&#xff0c;进入Windows设置&#xff0c;检查更新。 更新完…

『运维备忘录』之 Sed 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是&#xff0c;甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作&#xff0c;持续给大家更新运维工作所需要接触到的知识点&#xff0c;希望大…

css篇---移动端适配的方案有哪几种

移动端适配 移动端适配是指同一个页面可以在不同的移动端设备上都有合理的布局。主流实现的方案有 响应式布局通过rem或者vw,vh 等实现不同设备有相同的比例而实现适配 首先需要了解viewport 【视口】 视口代表了一个可看见的多边形区域&#xff08;通常来说是矩形&#xff0…

人工智能学习与实训笔记(六):神经网络之智能推荐系统

人工智能学习笔记汇总链接&#xff1a;人工智能学习与实训笔记汇总-CSDN博客 本篇目录 七、智能推荐系统处理 7.1 常用的推荐系统算法 7.2 如何实现推荐 7.3 基于飞桨实现的电影推荐模型 7.3.1 电影数据类型 7.3.2 数据处理 7.3.4 数据读取器 7.3.4 网络构建 7.3.4.1…

LV.23 D2 开发环境搭建及平台介绍 学习笔记

一、Keil MDK-ARM简介及安装 Keil MDK&#xff0c;也称MDK-ARM&#xff0c;Realview MDK &#xff08;Microcontroller Development Kit&#xff09;等。目前Keil MDK 由三家国内代理商提供技术支持和相关服务。 MDK-ARM软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备…

《Go 简易速速上手小册》第6章:错误处理和测试(2024 最新版)

文章目录 6.1 错误处理机制 - Go 语言中的优雅回旋6.1.1 基础知识讲解6.1.2 重点案例&#xff1a;文件读取器功能描述实现代码 6.1.3 拓展案例 1&#xff1a;网络请求处理器功能描述实现代码 6.1.4 拓展案例 2&#xff1a;数据库查询执行器功能描述实现代码 6.2 编写可测试的代…

C++类和对象-多态->案例1计算器类、案例2制作饮品、案例3电脑组装需求分析和电脑组装具体实现

#include<iostream> using namespace std; #include<string> //分别利用普通写法和多态技术实现计算器 //普通写法 class Calculator { public: int getResult(string oper) { if (oper "") { return m_Num1 m_Num2; …

[AIGC_coze] Kafka 的主题分区之间的关系

Kafka 的主题分区之间的关系 在 Kafka 中&#xff0c;主题&#xff08;Topics&#xff09;和分区&#xff08;Partitions&#xff09;是两个重要的概念&#xff0c;它们之间存在着密切的关系。 主题是 Kafka 中用于数据发布和订阅的逻辑单元。每个主题可以包含多个分区&#x…

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱2(附带项目源码)

效果演示 文章目录 效果演示系列目录前言拖放、交换物品绘制拖拽物品插槽UI修改Inventory&#xff0c;控制拖放功能 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列&#xff01;本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中&#xf…