Home Web Front-end JS Tutorial nodejs implements WeChat code scanning payment function

nodejs implements WeChat code scanning payment function

Feb 22, 2018 am 09:00 AM
javascript nodejs Function

Preparation work

WeChat public account-appid

WeChat merchant account-mch_id

key value (required for the signature algorithm, is actually a For a 32-bit password, you can use md5 to generate one) (key setting path: WeChat Merchant Platform (pay.weixin.qq.com)-->Account Settings-->API Security-->Key Settings)

Scan QR code to pay - unified ordering

The following is WeChat mode 2 because it is simpler


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

let MD5 = require('md5'),

  xml2js = require('xml2js'),

  url = "https://api.mch.weixin.qq.com/pay/unifiedorder",// 下单请求地址

  appid = '公众号id',

  mch_id = '微信商户号';

  notify_url = '回调地址',

  out_trade_no = '自己设置的订单号',// 微信会有自己订单号、我们自己的系统需要设置自己的订单号

  total_fee = '订单金额',// 注意,单位为分

  body = '商品简单描述',

  trade_type = 'NATIVE',// 交易类型,JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付

  nonce_str = moment().format('YYYYMMDDHHmmssSSS'),// 随机字符串32位以下

  stringA = `appid=${公众号id}&body=${body}&mch_id=${微信商户号}&nonce_str=${nonce_str}&notify_url=${

  notify_url}&out_trade_no=${out_trade_no}&spbill_create_ip=${ctx.request.ip}&total_fee=${total_fee}&trade_type=${trade_type}`,

  stringSignTemp = stringA + "&key=xxxxxxxxxxxxxxxxx", //注:key为商户平台设置的密钥key

  sign = MD5(stringSignTemp).toUpperCase(); //注:MD5签名方式

Copy after login

The above are some parameters we need

For the signature generation algorithm, see WeChat official: https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=4_3

spbill_create_ip is the terminal ip address

The following splices all the parameters into xml


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

const formData = "<xml>";

  formData += "<appid>" + appid + "</appid>"; //appid

  formData += "<body>" + body + "</body>"; //商品或支付单简要描述

  formData += "<mch_id>" + mch_id + "</mch_id>"; //商户号

  formData += "<nonce_str>" + nonce_str + "</nonce_str>"; //随机字符串,不长于32位

  formData += "<notify_url>" + notify_url + "</notify_url>"; //支付成功后微信服务器通过POST请求通知这个地址

  formData += "<out_trade_no>" + out_trade_no + "</out_trade_no>"; //订单号

  formData += "<total_fee>" + total_fee + "</total_fee>"; //金额

  formData += "<spbill_create_ip>" + ctx.request.ip + "</spbill_create_ip>"; //ip

  formData += "<trade_type>NATIVE</trade_type>"; //NATIVE会返回code_url ,JSAPI不会返回

  formData += "<sign>" + sign + "</sign>";

  formData += "</xml>";

// 这里使用了egg里面请求的方式

const resultData = yield ctx.curl(url, {

    method: &#39;POST&#39;,

    content: formData,

    headers: {

      &#39;content-type&#39;: &#39;text/html&#39;,

    },

  });

 

// xml转json格式

xml2js.parseString(resultData.data, function (err, json) {

  if (err) {

    new Error("解析xml报错")

  } else {

    var result = formMessage(json.xml); // 转换成正常的json 数据

    console.log(result) //打印出返回的结果

  }

})

var formMessage = function (result) {

  var message = {};

  if (typeof result === &#39;object&#39;) {

    var keys = Object.keys(result);

    for (var i = 0; i < keys.length; i++) {

      var item = result[keys[i]];

      var key = keys[i];

      if (!(item instanceof Array) || item.length === 0) {

        continue;

      }

      if (item.length === 1) {

        var val = item[0];

        if (typeof val === &#39;object&#39;) {

          message[key] = formMessage(val);

        } else {

          message[key] = (val || &#39;&#39;).trim();

        }

      } else {

        message[key] = [];

        for (var j = 0, k = item.length; j < k; j++) {

          message[key].push(formMessage(itemp[j]));

        }

      }

    }

  }

  return message;

}

Copy after login

The egg request is used above Method, native node can use request


##

1

2

3

4

5

6

7

8

9

var request = require(&#39;request&#39;);

  request({

    url: url,

    method: "POST",

    body: formData

  }, function(error, response, body) {

    if (!error && response.statusCode == 200) {

    }

  });

Copy after login
If the request is successful, an xml will eventually be returned, and then we will parse it into json format, which will have a code_url and out_trade_no, we These two need to be returned to the front end, and then the QR code is generated and displayed to the user to scan the code to complete the payment.

Monitor whether the payment is successful

The above operations After completion, we need to know whether the user has completed the payment, because the user will stay on this page, and we need to notify the user that the payment was successful after the user has completed the payment.


First of all, when the user initiates payment, we will generate a QR code to allow the user to scan the code to pay. What we also need to do is to set up a timer and send a request every once in a while. , at this time, our node background needs to write an interface for querying orders. Previously we got out_trade_no, which is the order number inside our system. We send this data to the interface for querying orders in the background, and then the background will request after receiving it. The query interface address of WeChat is https://api.mch.weixin.qq.com/pay/orderquery. The process is the same as above, except that the interface address is different from the xml returned by WeChat. The returned fields will have a status of SUCCESS and NOTPAY, we can return it to the front end by judging whether to pay. After success, it will prompt the user that the payment is successful and close the timer.

Callback address

This is a very important part. Most operations can actually be completed above, but there are special circumstances, such as users The computer is disconnected and cannot send requests, but the mobile phone is used to pay, which will result in us not being able to record the user's payment information. At this time, the callback address is very important

Set the callback address

WeChat Merchant Center->Product Center->Development Configuration->Scan QR code After paying

, what we need to do is to use POST on the backend to receive the asynchronous callback information sent by WeChat, which is also in XML format. Note here that if receiving XML is not supported, you may get empty data


It should also be noted here that while saving the user's payment information, we must first check whether the order is paid to avoid repeated operations and the possibility of inserting multiple records

Summary

There are still pitfalls in WeChat scan code payment. If this is your first time, here is a list of things you need to pay attention to

  1. The signature algorithm must be written correctly, otherwise it will not be successful. It must be spliced ​​correctly.

  2. WeChat returns data in xml format. We have to convert it to json through a plug-in, which is convenient. Obtain data

  3. The returned code_url is used to generate a QR code for the front end, and then a timer needs to be set up to query whether the order has been paid, and finally the user is notified of the result

  4. The callback address is very important. Our backend needs to post to receive the callback information returned by WeChat and then save the information. However, before saving the user's payment information, we need to know whether the order has been saved to avoid repeated additions. Also, the returned XML data must be ensured by the backend to be able to receive it. It cannot be received in the normal way and requires additional settings.

Related recommendations:

After the PC terminal WeChat scans the code to pay successfully, it will automatically jump to the php version code sharing

微信QR code payment mode

php implements WeChat code scanning payment sample code sharing


The above is the detailed content of nodejs implements WeChat code scanning payment function. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Is nodejs a backend framework? Is nodejs a backend framework? Apr 21, 2024 am 05:09 AM

Node.js can be used as a backend framework as it offers features such as high performance, scalability, cross-platform support, rich ecosystem, and ease of development.

How to connect nodejs to mysql database How to connect nodejs to mysql database Apr 21, 2024 am 06:13 AM

To connect to a MySQL database, you need to follow these steps: Install the mysql2 driver. Use mysql2.createConnection() to create a connection object that contains the host address, port, username, password, and database name. Use connection.query() to perform queries. Finally use connection.end() to end the connection.

What are the global variables in nodejs What are the global variables in nodejs Apr 21, 2024 am 04:54 AM

The following global variables exist in Node.js: Global object: global Core module: process, console, require Runtime environment variables: __dirname, __filename, __line, __column Constants: undefined, null, NaN, Infinity, -Infinity

What is the difference between npm and npm.cmd files in the nodejs installation directory? What is the difference between npm and npm.cmd files in the nodejs installation directory? Apr 21, 2024 am 05:18 AM

There are two npm-related files in the Node.js installation directory: npm and npm.cmd. The differences are as follows: different extensions: npm is an executable file, and npm.cmd is a command window shortcut. Windows users: npm.cmd can be used from the command prompt, npm can only be run from the command line. Compatibility: npm.cmd is specific to Windows systems, npm is available cross-platform. Usage recommendations: Windows users use npm.cmd, other operating systems use npm.

Is there a big difference between nodejs and java? Is there a big difference between nodejs and java? Apr 21, 2024 am 06:12 AM

The main differences between Node.js and Java are design and features: Event-driven vs. thread-driven: Node.js is event-driven and Java is thread-driven. Single-threaded vs. multi-threaded: Node.js uses a single-threaded event loop, and Java uses a multi-threaded architecture. Runtime environment: Node.js runs on the V8 JavaScript engine, while Java runs on the JVM. Syntax: Node.js uses JavaScript syntax, while Java uses Java syntax. Purpose: Node.js is suitable for I/O-intensive tasks, while Java is suitable for large enterprise applications.

Is nodejs a back-end development language? Is nodejs a back-end development language? Apr 21, 2024 am 05:09 AM

Yes, Node.js is a backend development language. It is used for back-end development, including handling server-side business logic, managing database connections, and providing APIs.

How to deploy nodejs project to server How to deploy nodejs project to server Apr 21, 2024 am 04:40 AM

Server deployment steps for a Node.js project: Prepare the deployment environment: obtain server access, install Node.js, set up a Git repository. Build the application: Use npm run build to generate deployable code and dependencies. Upload code to the server: via Git or File Transfer Protocol. Install dependencies: SSH into the server and use npm install to install application dependencies. Start the application: Use a command such as node index.js to start the application, or use a process manager such as pm2. Configure a reverse proxy (optional): Use a reverse proxy such as Nginx or Apache to route traffic to your application

Which one to choose between nodejs and java? Which one to choose between nodejs and java? Apr 21, 2024 am 04:40 AM

Node.js and Java each have their pros and cons in web development, and the choice depends on project requirements. Node.js excels in real-time applications, rapid development, and microservices architecture, while Java excels in enterprise-grade support, performance, and security.

See all articles