如何实现微信二维码支付功能???

首先呢,要实现微信支付,首先要申请一个公众号,人家支付的money才能到你口袋噢,不然,你可以不用申请,来, 给你提供一个号,尽管支付,别客气,嚯嚯[偷笑]

咱们别造了哈, 直接开货吧!!!

一. 微信支付概述

**(1)**账号申请

步骤一:注册公众号,根据自身主体类型注册对应的公众号

注意: 只能申请服务号,订阅号没有办法申请支付

煌sir给你提供申请网址: 安排666

https://kf.qq.com/product/weixinmp.html#hid=87

img

步骤二:微信认证,公众号认证后才可申请微信支付

img

注意噢:(想要拥有属于自己的专属号,需要提交费用审核噢)

img

步骤三:申请微信支付

  • 登录公众平台,点击左侧菜单【微信支付】,开始填写资料等待审核,审核时间为1-5个工作日内。

img

步骤四:商户账号审核

  • 审核通过之后会往您填写的邮箱里发一封邮件是关于微信支付商户的帐号信息,同时您对公账户上也会收到几毛钱的汇款,需要您查看下具体的金额然后登录微信支付商户平台进行验证

步骤五:在线签署协议

  • 本协议为线上电子协议,签署后方可进行交易及资金结算,签署完立即生效。

步骤六:完成上述步骤,你可以得到调用API用到的账号和密钥

  • appid:微信公众账号或开放平台APP的唯一标识
  • mch_id:商户号
  • key:商户密钥

img

(2)测试账号:

当然,如果有小伙伴想要更快的功能实现,可以不申请,可以先用这个账号尝试测试实现

appid: wx8397f8696b538317

mch_id:1473426802

key: T6m9iK73b0kn9g5v426MKfHQH7X8rKwb

(3)支付接口和SDK

微信支付帮助文档地址:

https://pay.weixin.qq.com/wiki/doc/api/index.html

手动调用,常见的接口(了解)

接口
下订单https://api.mch.weixin.qq.com/pay/unifiedorder
查询订单https://api.mch.weixin.qq.com/pay/orderquery
关闭订单https://api.mch.weixin.qq.com/pay/closeorder

手动调用整体思路:

  1. 根据接口要求,组装请求参数
  2. 以XML的方式,通过POST请求,发送给支付接口
  3. 微信支付接口,以XML方式给予响应

实际开发中,我们很少直接使用“接口操作”。通常情况下使用微信提供的SDK(工具类)

com.github.wxpay.sdk.WXPay 类就是核心操作封装类。

方法名说明
microPay刷卡支付
unifiedOrder统一下单
orderQuery查询订单
reverse撤销订单
closeOrder关闭订单
refund申请退款
refundQuery查询退款
downloadBill下载对账单
report交易保障
shortUrl转换短链接
authCodeToOpenid授权码查询openid

二.测试实现:

1.统一下单后台实现

在测试项目完成操作

步骤一:添加依赖

<dependency>
	<groupId>com.github.wxpay</groupId>
	<artifactId>wxpay-sdk</artifactId>
	<version>0.0.3</version>
</dependency>

img

步骤二:编写配置类,实现WXPayConfig接口

package com.czxy.changgou3.weixin;

import com.github.wxpay.sdk.WXPayConfig;

import java.io.InputStream;

/**
 * @author huangsir@itcast.cn
 * @version 1.0
 **/
public class MyWXPayConfig implements WXPayConfig {
    /**
     * 应用ID:微信开发平台审核通过的应用APPID
     * @return
     */
    @Override
    public String getAppID() {
        return "wx8397f8696b538317";
    }

    /**
     * 商户号:微信支付分配的商户号
     * @return
     */
    @Override
    public String getMchID() {
        return "1473426802";
    }

    /**
     * 秘钥,用于生成签名(sign)
     * @return
     */
    @Override
    public String getKey() {
        return "T6m9iK73b0kn9g5v426MKfHQH7X8rKwb";
    }

    @Override
    public InputStream getCertStream() {
        return null;
    }

    /**
     * 连接超时时间,单位是毫秒
     * @return
     */
    @Override
    public int getHttpConnectTimeoutMs() {
        return 0;
    }

    /**
     * 读超时时间,单位是毫秒
     * @return
     */
    @Override
    public int getHttpReadTimeoutMs() {
        return 0;
    }
}

步骤三:后台测试类

下单:
package com.czxy.changgou3.weixin;

import com.github.wxpay.sdk.WXPay;

import java.util.HashMap;
import java.util.Map;

/**
 * @author huangsir@itcast.cn
 * @version 1.0
 **/
public class TestWXPAYunifiedOrder {
    public static void main(String[] args) throws Exception {
        //下单过程
        //1/准备配置类
        MyWXPayConfig config = new MyWXPayConfig();

        //2/准备核心类
        WXPay wxPay = new WXPay(config);
        //3.准备参数
        Map<String, String> map = new HashMap<>();
        map.put("body", "第一个"); //商品描述
        map.put("out_trade_no", "202010001225023");//商户订单号
        map.put("total_fee", "111");  //标价金额
        map.put("spbill_create_ip", "127.0.0.1"); //终端IP
        map.put("notify_url", "http://www.baidu.com"); //通知地址
        map.put("trade_type", "NATIVE");//交易类型

        //4.调用方法
        Map<String, String> result = wxPay.unifiedOrder(map);

        //5.处理结果
        System.out.println("返回状态码" + result.get("return_code"));
        System.out.println("返回信息" + result.get("return_msg"));
        System.out.println("业务结果" + result.get("result_code"));
        System.out.println("交易类型" + result.get("trade_type"));
        System.out.println("二维码链接:"+result.get("code_url"));
        System.out.println(result);

    }
}

控制台显示:

img

查询订单:
package com.czxy.changgou3.weixin;

import com.github.wxpay.sdk.WXPay;

import java.util.HashMap;
import java.util.Map;

/**
 * @author huangsir@itcast.cn
 * SUCCESS—支付成功
 * REFUND—转入退款
 * NOTPAY—未支付
 * CLOSED—已关闭
 * REVOKED—已撤销(刷卡支付)
 * USERPAYING--用户支付中
 * PAYERROR--支付失败
 **/
public class TestWXPayOrderQuery {
    public static void main(String[] args) throws Exception {
        //1.准备配置类
        MyWXPayConfig payConfig = new MyWXPayConfig();
        //2.准备核心配置类
        WXPay wxPay = new WXPay(payConfig);
        //3准备参数
        Map<String, String> map = new HashMap();
        map.put("out_trade_no", "202010001225023");         //商户订单号

        //4.查询
        Map<String, String> result = wxPay.orderQuery(map);
        //5.处理结果
        System.out.println("返回状态码" + result.get("return_code"));
        System.out.println("返回信息" + result.get("return_msg"));
        System.out.println("业务结果" + result.get("result_code"));
        System.out.println("交易状态" + result.get("trade_state"));
        System.out.println("交易状态描述:" + result.get("trade_state_desc"));
        System.out.println(result);
    }
}

控制台显示:

img

2.前端实现:

(1)JS版二维码:QRCode.js

**概述:**QRCode.js 是一个用于生成二维码的 JavaScript 库。主要是通过获取 DOM 的标签,再通过 HTML5 Canvas 绘制而成,不依赖任何库。

煌sir直接提供二维码生成器js文件:需要的自行下载: (qrcode.min.js)

链接:https://pan.baidu.com/s/1Bfao-5bzVOAar1C0CVf-PQ
提取码:zesb

在vue前端

  1. 拷贝 qrcode.min.js

img

2.编写wxpay.html

Document

​ //核心类

​ let qrcode = new QRCode ( document . getElementById ( ‘qrcode’ ),

​ {

​ width: 200 , height: 200

​ });

​ //2.设置数据(需要修改这个地址:要根据你后端下单生成的连接)

​ qrcode . makeCode ( ‘weixin://wxpay/bizpayurl?pr=3I85g9R’ )

最终启动,访问页面:

http://localhost:3000/wxpay.html

img

到这里,微信支付的基本实现就完成了,想要实现更完美的代码和展示,那小伙伴们自己就使劲去造吧,嚯嚯…

看完恭喜你,又知道了一点点!!!

你知道的越多,不知道的越多!

~感谢志同道合的你阅读, 你的支持是我学习的最大动力 ! 加油 ,陌生人一起努力,共勉!!

<think>嗯,用户想了解如何使用Node.js实现微信支付的Native支付功能。首先,我需要回忆一下微信支付的流程,特别是Native支付的部分。Native支付适用于PC网站,用户扫描二维码后完成支付。所以,我需要考虑整个流程,包括生成订单、获取二维码、处理回调通知等步骤。 首先,用户可能需要了解准备工作,比如申请商户号、设置API密钥等。这部分很重要,因为后续的接口调用都需要这些信息。然后,生成预支付订单,调用统一下单接口,这里需要用到的参数比如appid、mch_id、nonce_str、sign_type、body、out_trade_no、total_fee、spbill_create_ip、notify_url、trade_type等。需要注意的是,Native支付的trade_type是NATIVE,product_id可能也需要,但根据微信文档,可能需要确认是否需要这个参数。 接下来,生成签名。微信支付要求对参数进行签名,使用HMAC-SHA256或者MD5,现在可能默认是HMAC-SHA256。生成签名的步骤是将参数按ASCII码排序,拼接成字符串,加上key,然后进行加密。这可能会容易出错,比如参数顺序不对或者拼接错误,需要特别注意。 然后,调用统一下单接口,获取返回的code_url,这个就是生成二维码的URL。用户需要用这个URL生成二维码图片,供用户扫描支付。生成二维码可以使用第三方库,比如qrcode,这个在Node.js中比较常用。 处理异步通知也是关键的一步。微信支付成功后,会向notify_url发送POST请求,携带XML格式的数据。服务器需要验证签名,确认请求的合法性,然后处理业务逻辑,比如更新订单状态。处理完成后,需要返回成功的XML响应,否则微信会多次通知。 查询订单状态可能也是需要的,特别是在用户支付后,前端可能需要轮询检查支付状态,或者处理异步通知时出现问题,需要主动查询。 可能还需要考虑异常处理,比如网络错误、签名错误、参数错误等。此外,商户订单号的生成需要保证唯一性,通常可以使用时间戳加随机数的方式。 用户可能对具体的代码实现感兴趣,所以给出一个示例代码会很有帮助。代码应该包括生成订单、签名生成、处理回调等部分。同时,需要注意安全,比如API密钥的保管,防止泄露。 另外,需要注意微信支付的API版本,不同版本可能有不同的要求。比如现在V3版本的API可能和之前的V2有所不同,参数和签名方式可能会有变化,所以需要参考最新的官方文档。 可能用户在实际开发中会遇到的问题包括签名错误、回调通知处理不当导致重复通知、二维码生成失败等。需要提醒用户仔细检查参数是否正确,尤其是金额单位是否正确(分),以及异步通知的URL是否可访问,并且正确处理响应。 总结来说,回答需要涵盖准备工作、生成预支付订单、生成签名、调用接口、生成二维码、处理回调通知、查询订单等步骤,并提供示例代码和注意事项。同时,引导用户参考官方文档,确保信息的准确性。以下是</think>使用 Node.js 实现微信支付 Native 支付(PC网站二维码支付)的核心流程和代码示例: --- ### **一、准备工作** 1. 申请微信支付商户号(mchid)和 AppID 2. 设置 API 密钥(`API_KEY`) 3. 准备证书文件(部分接口需要) 4. 确保服务器 IP 加入微信支付白名单 --- ### **二、核心流程** 1. **生成预支付订单** ```javascript const crypto = require('crypto'); const axios = require('axios'); const xml2js = require('xml2js'); // 微信支付配置 const config = { appid: '你的AppID', mch_id: '商户号', key: 'API密钥', notify_url: 'https://yourdomain.com/notify' // 支付结果回调地址 }; // 生成随机字符串 function generateNonceStr() { return Math.random().toString(36).substr(2, 15); } // 生成签名(HMAC-SHA256) function createSign(params) { const sortedParams = Object.keys(params).sort().map(key => `${key}=${params[key]}`).join('&'); const signStr = sortedParams + `&key=${config.key}`; return crypto.createHash('sha256').update(signStr, 'utf8').digest('hex').toUpperCase(); } // 统一下单接口 async function createOrder(orderData) { const params = { appid: config.appid, mch_id: config.mch_id, nonce_str: generateNonceStr(), body: orderData.description, // 商品描述 out_trade_no: orderData.tradeNo, // 商户订单号 total_fee: orderData.amount, // 金额(单位:分) spbill_create_ip: orderData.clientIp, notify_url: config.notify_url, trade_type: 'NATIVE' }; params.sign = createSign(params); // 构造 XML 请求体 const builder = new xml2js.Builder(); const xmlBody = builder.buildObject({ xml: params }); // 发送请求 const response = await axios.post('https://api.mch.weixin.qq.com/pay/unifiedorder', xmlBody, { headers: { 'Content-Type': 'application/xml' } }); // 解析 XML 响应 const result = await xml2js.parseStringPromise(response.data, { explicitArray: false }); return result.xml; } ``` 2. **生成支付二维码** ```javascript const QRCode = require('qrcode'); // 使用返回的 code_url 生成二维码 async function generateQRCode(codeUrl) { try { const qr = await QRCode.toDataURL(codeUrl); return `<img src="${qr}">`; // 返回 base64 图片或保存为文件 } catch (err) { throw new Error('生成二维码失败'); } } ``` 3. **处理支付回调** ```javascript const express = require('express'); const app = express(); app.post('/notify', express.text({ type: 'application/xml' }), async (req, res) => { // 解析 XML 通知 const result = await xml2js.parseStringPromise(req.body, { explicitArray: false }); const notifyData = result.xml; // 验证签名 const sign = notifyData.sign; delete notifyData.sign; const localSign = createSign(notifyData); if (sign === localSign) { if (notifyData.result_code === 'SUCCESS') { // 处理支付成功逻辑(更新订单状态) console.log('支付成功:', notifyData.out_trade_no); res.send('<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>'); } } else { res.status(403).send('签名验证失败'); } }); ``` --- ### **三、调用示例** ```javascript // 创建订单 const orderData = { tradeNo: 'ORDER_123456', description: '测试商品', amount: 100, // 1元 = 100分 clientIp: '用户IP' }; createOrder(orderData) .then(response => { if (response.return_code === 'SUCCESS') { generateQRCode(response.code_url).then(qr => { // 将 qr 返回给前端展示 }); } }) .catch(console.error); ``` --- ### **四、注意事项** 1. **金额单位**:微信支付使用 `分` 作为单位(例如 1元 = 100分) 2. **订单号唯一性**:`out_trade_no` 必须全局唯一 3. **超时处理**:二维码有效期为2小时,需处理超时未支付订单 4. **安全验证**:务必验证回调签名,防止伪造请求 5. **证书**:部分敏感接口(如退款)需使用商户证书 --- ### **五、参考文档** - [微信支付 Native 开发文档](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1) - 最新 API 请以微信官方文档为准
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值