jjzjj

微信小程序JSAPI下单支付PHP前后端教程

千惠相公 2023-04-03 原文

准备数据:

微信支付API证书,微信支付商户号,小程序appid,微信支付API证书序列号

获取微信支付api证书教程:如何下载微信支付证书(API证书)_荒~的博客-CSDN博客_微信支付证书

获取微信支付API证书序列号:点击管理证书即可看到

 

第一步:生成预支付交易单

参考文档:微信支付-开发者文档 (qq.com)

按照请求参数的需求创建出一个json数据 

数据示例

这是前端创建的一个请求参数的对象

下面展示PHP后端的文件目录,cert用于上传微信支付API证书

这是cert文件夹内容

开始写PHP端的pay.php文件用于生成签名

参考文档签名生成-接口规则 | 微信支付商户平台文档中心 (qq.com)

下面我们以JSAPI下单接口为例参考文档微信支付-开发者文档 (qq.com)

请求URL:https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi

请求方式:POST

<?php
//微信支付API证书序列号
$serial_no="ABCDEFG";
//你的小程序appid
$appid="123456";
//$body是用于接收前端请求携带的参数
$body=json_decode(file_get_contents("php://input"),true);
//请求接口的请求方式
$http_method=$body['http_method'];
//生成时间戳
$timestamp = time();
//生成随机数
$nonce=randomString(32);
//接收需要给接口发起请求携带的请求体
$data=$body['data'];
//接口url
$url=$body['url'];
$url_parts = parse_url($url);
$canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
$message = $http_method."\n".
$canonical_url."\n".
$timestamp."\n".
$nonce."\n".
$data."\n";
//获取私钥文件
$mch_private_key = file_get_contents('./cert/apiclient_key.pem');
//生成签名
openssl_sign($message, $raw_sign,$mch_private_key, 'sha256WithRSAEncryption');
$sign =base64_encode($raw_sign);
$token=sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',
$appid, $nonce, $timestamp, $serial_no, $sign);
//输出数据
print_r(json_encode(["msg"=>"预订单生成成功","code"=>200,"token"=>$token,"data"=>$data,"timestamp"=>$timestamp,"nonce"=>$nonce]));
// 生成随机字符串函数
function randomString($len = 32)
{
    $string = '';
    $char = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
    for ($i = 0; $i < $len; $i++) {
        $string .= $char[mt_rand(0, strlen($char) - 1)];
    }
    return $string;
}
?>

下面是前端对pay.php文件发起请求

请求成功将会得到 timestamp(时间戳),nonce(随机字符串),data(发送给jsapi接口的请求体)

第二步:前端对jsapi下单接口发起请求

请求URL:https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi

请求方式:POST

 请求成功后会返回prepay_id,如果没有返回就说明出错了

第三步:写后端sign.php文件

<?php
//你的小程序appid
$appid="wx123";
//用于接收前端发起请求携带的参数
$body=json_decode(file_get_contents("php://input"),true);
//用户对JSAPI下单接口发起请求后得到的prepay_id
$prepay_id=$body['prepay_id'];
//时间戳
$timestamp =$body['timestamp'];
//随机字符串
$nonce=$body['nonce'];
$message = $appid."\n".
$timestamp."\n".
$nonce."\n".
$prepay_id."\n";
//获取私钥文件
$mch_private_key = file_get_contents('./cert/apiclient_key.pem');
// 生成签名
openssl_sign($message, $raw_sign,$mch_private_key, 'sha256WithRSAEncryption');
$sign = base64_encode($raw_sign);
print_r(json_encode(["msg"=>"签名成功","code"=>200,"sign"=>$sign]));
?>

对sign.php文件发起请求

请求成功后得到sign,最后调用小程序的拉起支付接口

这是paysuccess.php文件用于支付成功的通知地址

 

 

 最后注意:没有对支付做安全处理请自行解决

有关微信小程序JSAPI下单支付PHP前后端教程的更多相关文章

  1. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

  2. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  3. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  4. ruby-on-rails - 与 ActiveMerchant 一起使用的最佳支付网关是什么? - 2

    我需要使用ActiveMerchant库在我们的一个Rails应用程序中设置支付解决方案。尽管这个问题非常主观,但人们对主要网关(BrainTree、Authorize.net等)的体验如何?它必须:处理定期付款。有能力记入个人帐户。能够取消付款。有办法存储用户的付款详细信息(例如Authotize.netsCIM)。干杯 最佳答案 ActiveMerchant很棒,但在过去一年左右的时间里,我在使用它时发现了一些问题。首先,虽然某些网关可能会得到“支持”——但并非所有功能都包含在内。查看功能矩阵以确保完全支持您选择的网关-http

  5. ruby - 在 ruby​​ 中的字符串前后添加空格? - 2

    我想在随机字符串前后添加一个空格。我试过使用"Random_string".center(1,"")但它不起作用。谢谢 最佳答案 我发现这是最优雅的解决方案:padded_string="#{random_string}"走简单的路没有错。 关于ruby-在ruby​​中的字符串前后添加空格?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/3357897/

  6. Ubuntu20.04系统WineHQ7.0安装微信 - 2

    提供3种Ubuntu系统安装微信的方法,在Ubuntu20.04上验证都ok。1.WineHQ7.0安装微信:ubuntu20.04安装最新版微信--可以支持微信最新版,但是适配的不是特别好;比如WeChartOCR.exe报错。2.原生微信安装:linux系统下的微信安装(ubuntu20.04)--微信适配的最好,反应最快,但是微信版本只到2.1.1,版本太老,很多功能都没有。3.深度deepin-wine6安装微信:ubuntu20.04+系统deepin-wine6安装新版微信--综合比较好,当前个人使用此种方法1个月,微信版本3.4;没什么大问题,尚可。一、WineHQ7.0安装微信

  7. 微信小程序订餐系统 - 2

    对传统的餐饮商家来说,小程序很好地解决了餐厅线下线上连接的问题,在引流获客、节约人力、营销宣传、塑造会员体系、改善消费体验等方面都有很大帮助。小程序点餐可以帮助餐饮企业节省一大把人力开支。一个包含扫码点单、菜品管理、优惠券推送、外卖配送的小程序,商家花几万元就能完成开发测试并投入。商家为什么要开通“扫码点餐”1.解决服务员不够用的问题。2.不怕顾客跑单漏单。3.在微信就能管理菜品、查看营业额。4.订单小票显示顾客桌号和已点菜品。5.可在“附近的小程序”找到您的门店。如今餐饮业常用的三种经营模式:1堂食点单模式客人通过小程序堂食点单。商家可以在微信扫码点餐小程序管理后台根据自己店内情况来设置不同

  8. 最新版人脸识别小程序 图片识别 生成二维码签到 地图上选点进行位置签到 计算签到距离 课程会议活动打卡日常考勤 上课签到打卡考勤口令签到 - 2

    技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进

  9. ruby-on-rails - 这个 C 和 PHP 程序员如何学习 Ruby 和 Rails? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它

  10. ruby - 如何在子类中的方法前后运行代码? - 2

    我的第一个想法是这样的:classAbstractBuilderattr_reader:time_takendefbuild_with_timerstarted_at=Time.nowbuild@time_taken=Time.now-started_atenddefbuildraise'Implementthismethodinasubclass'endendclassMyBuilder我怀疑有更好的方法可以提供更好的灵active,例如理想情况下,我想在MyBuilder的实例上调用“build”而不是“build_with_timer”,并且始终记录执行时间。我确实考虑过使用al

随机推荐