广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP 实现微信Native扫码支付
  • 438
分享到

PHP 实现微信Native扫码支付

开发语言php微信thinkphp 2023-09-25 13:09:25 438人浏览 安东尼
摘要

目录 一、安装微信SDK 二、准备请求资料 三、引入和定义 四、Native下单 五、Native调起支付 六、Native异步通知 一、安装微信SDK composer require wechatpay/wech

目录

一、安装微信SDK

二、准备请求资料

三、引入和定义

四、Native下单

五、Native调起支付

六、Native异步通知


一、安装微信SDK

composer require wechatpay/wechatpay

二、准备请求资料

appid:开放平台

mchid:商户平台

商户api证书:商户平台-账户中心-api安全(申请)

商户API秘钥:商户平台-账户中心-api安全(申请)

商户证书序列号:开放平台-API管理

apiv3_key:商户平台-api安全

微信支付平台证书:(在项目根目录执行命令,保证sdk已安装 证书保存文件夹已经创建 outputFilePath 保存地址是项目地址中的文件夹)

PHP vendor/bin/CertificateDownloader.php -k ${apiV3key} -m ${mchId} -f ${mchPrivateKeyFilePath} -s ${mchSerialNo} -o ${outputFilePath}

${apiV3key} 替换成apiV3key秘钥

${mchId} 替换成商户号

${mchPrivateKeyFilePath} 替换成商户私钥路径

${mchSerialNo} 替换成商户证书序列号

${outputFilePath} 替换成微信支付证书要保存的路径

三、引入和定义

use WeChatPay\Builder;use WeChatPay\Crypto\AesGCm;use WeChatPay\Crypto\Rsa;use WeChatPay\FORMatter;use WeChatPay\Util\PemUtil;    private const APPID     = '';        //appid    private const MCHID     = '';        //商户号    private const CERT_NUM  = '';        //商户证书序列号    private const APIV3_KEY = '';        //apiv3秘钥

四、Native下单

返回一个code_url 后端生成二维码显示给前端

    //Native下单    public function paymentCode($out_trade_no, $description, $notify_url, $total)    {        // 微信配置        $merchantId = self::MCHID;  // 商户号        $appid      = self::APPID;  // appid        // 从本地文件中加载「商户API私钥」,「商户API私钥」会用来生成请求的签名        $merchantPrivateKeyFilePath = 'file://' . ROOT_PATH . '\app\...私钥路径..\apiclient_key.pem';        $merchantPrivateKeyInstance =  Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE);        // 「商户API证书」的「证书序列号」        $merchantCertificateSerial = self::CERT_NUM;        // 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名        $platformCertificateFilePath = 'file://' . ROOT_PATH . '\app\...支付证书路径...\wechatpay_123456.pem';        $platformPublicKeyInstance = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC);        // 从「微信支付平台证书」中获取「证书序列号」        $platformCertificateSerial = PemUtil::parseCertificateSerialNo($platformCertificateFilePath);        // 构造一个 APIv3 客户端实例        $instance = Builder::factory([            'mchid'      => $merchantId,            'serial'     => $merchantCertificateSerial,            'privateKey' => $merchantPrivateKeyInstance,            'certs'      => [                $platformCertificateSerial => $platformPublicKeyInstance,            ],        ]);        try {            $resp = $instance                ->chain('v3/pay/transactions/native')                ->post(['json' => [                    'mchid'        => $merchantId,                    'out_trade_no' => $out_trade_no,                    'appid'        => $appid,                    'description'  => $description,                    'notify_url'   => $notify_url,                    'amount'       => [                        'total'    => $total * 100,                        'currency' => 'CNY'                    ],                ]]);            echo $resp->getStatusCode(), PHP_EOL;            echo $resp->getBody(), PHP_EOL;        //返回的code_url        } catch (\Exception $e) {            // 进行错误处理                echo $e->getMessage(), PHP_EOL;            if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {                $r = $e->getResponse();                echo $r->getStatusCode() . ' ' . $r->getReasonPhrase(), PHP_EOL;                echo $r->getBody(), PHP_EOL, PHP_EOL, PHP_EOL;            }            echo $e->getTraceAsString(), PHP_EOL;        }    }

五、Native调起支付

用户扫码即调起

六、Native异步通知

    // 异步通知    public function wxPayNotify()    {        $headers = $this->request->header();        $inWechatpaySignature = $headers['wechatpay-signature'];   // 应答heade中对应数据:应答签名        $inWechatpayTimestamp = $headers['wechatpay-timestamp'];   // 应答heade中对应数据:应答时间戳        $inWechatpaySerial    = $headers['wechatpay-serial'];      // 应答heade中对应数据:应答平台证书序列号        $inWechatpayNonce     = $headers['wechatpay-nonce'];       // 应答heade中对应数据:应答随机字符串        $inBody               = file_get_contents('php://input');  // 应答主体:请根据实际情况获取,例如: file_get_contents('php://input');        $apiv3Key             = self::APIV3_KEY;                   // 在商户平台上设置的APIv3密钥        // 根据通知的平台证书序列号,查询本地平台证书文件,        $platformPublicKeyInstance = Rsa::from('file://' . ROOT_PATH . '\app\..路径..\wxpay_cert\wechatpay_1234563.pem', Rsa::KEY_TYPE_PUBLIC);        // 检查通知时间偏移量,允许5分钟之内的偏移        $timeOffsetStatus = 300 >= abs(Formatter::timestamp() - (int)$inWechatpayTimestamp);        $verifiedStatus   = Rsa::verify(            // 构造验签名串            Formatter::joinedByLineFeed($inWechatpayTimestamp, $inWechatpayNonce, $inBody),            $inWechatpaySignature,            $platformPublicKeyInstance        );        if ($timeOffsetStatus && $verifiedStatus) {            // 转换通知的JSON文本消息为PHP Array数组            $inBodyArray = (array)json_decode($inBody, true);            // 使用PHP7的数据解构语法,从Array中解构并赋值变量            ['resource' => [                'ciphertext'      => $ciphertext,                'nonce'           => $nonce,                'associated_data' => $aad            ]] = $inBodyArray;            // 加密文本消息解密            $inBodyResource = AesGcm::decrypt($ciphertext, $apiv3Key, $nonce, $aad);            // 把解密后的文本转换为PHP Array数组            $inBodyResourceArray = (array)json_decode($inBodyResource, true);            // print_r($inBodyResourceArray); // 打印解密后的结果            $out_trade_no = $inBodyResourceArray['out_trade_no'];            $trade_state  = $inBodyResourceArray['trade_state'];            $total        = $inBodyResourceArray['amount']['total'];            if (Db::name('记录表')->where('out_trade_no', $out_trade_no)->find()) {                http_response_code(200);                $data =  [                    'code'    => 'SUCCESS',                    'message' => '成功'                ];                return json_encode($data);            } else {               //订单处理业务                http_response_code(200);                $data =  [                    'code'    => 'SUCCESS',                    'message' => '成功'                ];                return JSON_encode($data);            }        } else {            // 调用微信查询订单API        }    }}

来源地址:https://blog.csdn.net/arlene12345/article/details/130883343

--结束END--

本文标题: PHP 实现微信Native扫码支付

本文链接: https://www.lsjlt.com/news/417413.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP 实现微信Native扫码支付
    目录 一、安装微信SDK 二、准备请求资料 三、引入和定义 四、Native下单 五、Native调起支付 六、Native异步通知 一、安装微信SDK composer require wechatpay/wech...
    99+
    2023-09-25
    开发语言 php 微信 thinkphp
  • PHP实现微信支付流程(Native支付)
    最近项目需要做微信支付的功能,想着把流程以及遇到的坑记录下来 1.到微信商户平台中去开通Native支付(产品中心-Native支付-申请开通) 2.微信商户平台中下载证书以及设置api密钥(账户中心-api安全),查看指引中很详细的说...
    99+
    2023-08-31
    php 微信 Powered by 金山文档
  • Thinkphp5如何实现微信扫码支付
    这篇文章给大家分享的是有关Thinkphp5如何实现微信扫码支付的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Thinkphp5内核整合微信扫码支付实例完整源码,ThinkPHP框架集成微信扫码支付,压缩包内置安...
    99+
    2023-06-04
  • 怎么用PHP实现支付宝和微信扫码在线支付的功能
    本篇内容介绍了“怎么用PHP实现支付宝和微信扫码在线支付的功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2022-10-18
  • PHP 实现微信支付 JSAPI
    目录 一、首先我们来填个坑 1:支付验签失败 二、代码示例 1.请求参数配置 2.统一下单API 3.MakeSign 签名 4.ToXml 数组参数转xml 5.postXmlCurl 发送请求 6.FromXml 结果xml参数转数组 ...
    99+
    2023-09-12
    php 微信 微信公众平台
  • php实现微信支付功能
    一、生成预支付订单并获取预支付ID(prepay_id): ...
    99+
    2023-09-11
    php
  • Thinkphp5框架集成微信扫码支付方法
    Thinkphp5框架集成微信扫码支付方法,Thinkphp框架用的人非常多,整合微信扫码支付的方法分享出来与大家一起学习!打开首页生成订单,并显示支付二维码public function index() {&...
    99+
    2023-06-05
  • 个人微信扫码支付有手续费吗
    个人微信扫码支付没有手续费,个人微信扫码支付是一种与商家直接交易的支付方式,同样也是一种为商家提供业务收款的渠道。因此,在许多情况下,商家会根据自己的需求和合作协议与微信支付达成一种手续费支付协议。本教程操作环境:windows10系统、微...
    99+
    2023-07-28
  • SpringBoot整合Vue实现微信扫码支付以及微信退款功能详解
    直接上代码,在order模块添加依赖 <dependency> <groupId>com.github.wxpay&l...
    99+
    2022-11-13
  • 教你用Java在个人电脑上实现微信扫码支付
    Java实现PC微信扫码支付 做一个电商网站支付功能必不可少,那我们今天就来盘一盘微信支付。 微信支付官方网站 业务流程: 开发指引文档 支付服务开发前提准备: 1.SDK下载:...
    99+
    2022-11-12
  • php实现微信jsapi支付(v2版本)
    统一下单 public function unifiedOrder($product_type = 1, $openid = '', $phone = '') { ...
    99+
    2023-10-09
    php 微信 开发语言
  • PHP实现 APP端微信支付功能
    一丶 PHP后台生成预支付交易单,返回正确的预支付交易回话标识后 调起支付,根据文档拼接微信需要的参数,这里将需要的几个方法进行示例; 传输给微信的参数要组装成xml格式发送,传如参数数组! publ...
    99+
    2023-10-18
    php 微信 android
  • PHP微信开发:如何实现JSAPI支付
    随着移动互联网的发展,微信已经成为了人们生活中不可或缺的一部分,越来越多的商家选择在微信平台上开展业务。实现微信支付功能对于商家来说是非常必要的。本文将介绍如何使用PHP实现JSAPI支付。首先,我们需要了解什么是JSAPI支付。JSAPI...
    99+
    2023-05-14
    实现 PHP微信开发 JSAPI支付
  • PHP 实现汇聚adapay调用微信支付
    目录 前言 一、下载SDK 二、配置 三、实际操作 1.引入SDK 2.代码参考 四、回调 总结 前言 先整理一下调起微信支付的流程: Adapay成功发起支付请求 -> 将请求成功中的 pay_info 返回给前端-> 前端使用 pay...
    99+
    2023-09-04
    php thinkphp 微信
  • vue项目中的支付功能实现(微信支付和支付宝支付)
    目录项目中常见的支付方式    支付宝支付微信支付项目中常见的支付方式     支付宝支付  &nbs...
    99+
    2022-11-12
  • iOS实现H5支付(微信、支付宝)原生封装
    前言 支付分APP支付、H5支付、扫码支付等。app支付一般在app中使用,并且需要集成相应的支付SDK,H5支付多用于网页。如果你的APP不想集成支付SDK,又想实现支付功能,你...
    99+
    2022-06-05
    iOS H5支付 微信 支付宝
  • php怎么实现微信扫码登录
    本文操作环境:windows10系统、php 7、thinkpad t480电脑。微信已经成为我们日常生活中必不可少的一部分,为了让更多的用户更加方便地使用微信及相关产品,微信扫一扫功能越来越普遍。那么如果我们要自己实现这个功能该如何做呢?...
    99+
    2018-06-26
    php 微信
  • PHP实现小程序微信支付(v3版本)
    PS:本篇文章是PHP对小程序进行微信支付v3版本的实现,仅用于对支付流程的了解,具体使用方面需要大家自行调整 小程序端JS代码: getPrepayID(){ var that = th...
    99+
    2023-09-17
    php 小程序 微信
  • PHP 实现微信支付 “请求单次分账”
    目录 一、小总结 二、服务层 一、小总结 分账 调用分账的订单必须是请求下单中以下参数等于  Y 的订单并且在下单接口中该参数也等于 Y 才能使用分账(可以参考一下PHP JSAPI调起微信支付API_一本曾经的博客-CSDN博客) "p...
    99+
    2023-09-01
    python 开发语言
  • Java利用沙箱支付实现电脑扫码支付教程
    目录一、准备工作二、效果展示三、实现代码3.1 后台代码3.2 前台代码一、准备工作 1、注册支付宝开放平台账号,成为开发者。 地址:https://open.alipay.com/...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作