목차
서문
개발 환경
Preparation
웹 프론트엔드 JS 튜토리얼 nodejs 환경에서 WeChat 코드 스캐닝 결제 기능을 구현하는 방법은 무엇입니까?

nodejs 환경에서 WeChat 코드 스캐닝 결제 기능을 구현하는 방법은 무엇입니까?

Jun 05, 2018 pm 05:18 PM
nodejs 코드를 스캔하여 결제하세요

이 기사에서는 nodejs를 사용하여 WeChat 스캔 코드 결제 기능을 작성하는 방법을 코드 예제를 통해 자세히 설명합니다. 관심 있는 친구는 이를 참조할 수 있습니다.

서문

이 글은 제가 위챗 스캔 코드 결제 과정에서 겪은 문제를 중심으로 여러분께 참고가 되었으면 좋겠습니다.

개발 환경

  • nodejs v8.1.0

  • egg v1.1.0

Preparation

WeChat public account-appid

WeChat 판매자 account-mch_id

키 값(서명 알고리즘에 필요하며 실제로는 32비트 비밀번호입니다. md5를 사용하여 생성할 수 있습니다. ) (주요 설정 경로: 위챗 가맹점 플랫폼(pay.weixin.qq.com)-->계정 설정-->API 보안-->주요 설정)

QR 코드를 스캔하여 통합 주문 결제

The 다음은 필수입니다 WeChat 모드 2는 상대적으로 간단하기 때문에 사용됩니다

  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签名方式
로그인 후 복사

위는 우리에게 필요한 몇 가지 매개 변수입니다

서명 생성 알고리즘은 WeChat 공식을 참조하세요: https://pay.weixin.qq.com/wiki/doc /api/native.php?chapter=4_3

spbill_create_ip는 터미널 IP 주소입니다

모든 매개변수는 xml

  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;
  }
로그인 후 복사
에 스플라이싱됩니다

var request = require(&#39;request&#39;);
  request({
    url: url,
    method: "POST",
    body: formData
  }, function(error, response, body) {
    if (!error && response.statusCode == 200) {
    }
  });
로그인 후 복사
위에서 egg 요청 방식을 사용하며, 네이티브 노드는 request

rrreee

를 사용할 수 있습니다. 요청이 성공하면 결국 XML이 반환됩니다. 그런 다음 이를 code_url 및 out_trade_no가 있는 json 형식으로 구문 분석한 다음 이 두 가지를 프런트 엔드에 반환해야 합니다. 사용자가 코드를 스캔하여 결제를 완료합니다

결제 성공 여부를 모니터링합니다

위 작업이 완료된 후 사용자는 이 페이지에 머물기 때문에 사용자가 결제를 완료했는지 여부를 알아야 합니다. 사용자가 결제를 완료한 후 결제가 성공했음을 사용자에게 알려야 합니다.

우선, 사용자가 결제를 시작하면 사용자가 코드를 스캔하여 결제할 수 있도록 QR 코드를 생성합니다. 타이머를 설정하고 가끔씩 요청을 보내는 것도 필요합니다. 이때 우리 노드 배경은 주문 조회를 위한 인터페이스를 작성해야 합니다. 우리는 이전에 우리 시스템 내부의 주문 번호인 out_trade_no를 얻었고, 그 후 이를 수신했습니다. 백엔드는 WeChat 쿼리 인터페이스 주소 https://api.mch.weixin.qq.com/pay/orderquery를 요청합니다. 인터페이스 주소가 WeChat에서 반환된 xml과 다르다는 점을 제외하면 프로세스는 위와 동일합니다. 필드에는 SUCCESS 및 NOTPAY 상태가 있으며 결제가 성공적으로 완료되면 사용자에게 메시지가 표시되고 타이머가 닫힙니다.

콜백 주소

이 부분은 실제로 대부분의 작업이 완료될 수 있지만 사용자의 컴퓨터 연결이 끊어져 요청을 보낼 수 없는데 사용자가 모바일을 통해 결제하는 등의 특수한 상황이 있습니다. 결과적으로 사용자의 결제 정보를 기록할 수 없습니다. 이때 콜백 주소가 매우 중요합니다

콜백 주소 설정

WeChat 판매자 센터->제품 센터->개발 구성->QR 코드 스캔하여 결제

이후 우리가 해야 할 일은 post를 사용하여 백엔드에서 수신하는 것입니다. WeChat에서 전송한 비동기 콜백 정보도 XML 형식입니다. XML 수신이 지원되지 않으면 빈 데이터가 나타날 수 있습니다.

여기서 저장하는 동안에도 주의해야 합니다. 사용자의 결제 정보를 먼저 확인하고 주문을 수정해야 합니다. 결제 여부에 관계없이 여러 개의 기록이 삽입될 수 있습니다

요약

이런 경우에도 WeChat 스캔 코드 결제에는 함정이 있습니다. 처음으로 주의해야 할 사항은 다음과 같습니다
  1. 서명 알고리즘은 올바르게 작성되어야 합니다. 그렇지 않으면 올바르게 연결되어야 합니다
  2. WeChat은 데이터를 xml로 반환합니다. 형식을 플러그인을 통해 json으로 변환해야 데이터를 쉽게 얻을 수 있습니다
  3. Return code_url은 프런트 엔드에 대한 QR 코드를 생성하는 데 사용되며 타이머가 필요합니다. 주문이 결제되었는지 확인하고 최종적으로 사용자에게 결과가 통보됩니다
  4. 콜백 주소는 매우 중요합니다. 백엔드에서 WeChat이 반환한 콜백 정보를 수신하려면 게시해야 하며, 그 정보를 저장해야 합니다. , 하지만 사용자의 결제 정보를 저장하기 전에 주문이 반복적으로 추가되는 것을 방지하기 위해 주문이 저장되었는지 여부를 알아야 합니다. 또한, 반환된 XML 데이터는 백엔드에서 수신할 수 있도록 보장되어야 정상적인 방법으로 수신할 수 없으며 추가 설정이 필요합니다.

위 내용은 제가 여러분을 위해 정리한 내용입니다. 앞으로 도움이 되길 바랍니다.

관련글 :

Vue에서 v-for의 데이터 그룹화 예시

vue2.0 계산 리스트 루프 후 누적값 계산 예시

vue.js 중첩 루프, 판단 시, 동적 삭제 예시

🎜

위 내용은 nodejs 환경에서 WeChat 코드 스캐닝 결제 기능을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

nodejs는 백엔드 프레임워크인가요? nodejs는 백엔드 프레임워크인가요? Apr 21, 2024 am 05:09 AM

Node.js는 고성능, 확장성, 크로스 플랫폼 지원, 풍부한 생태계, 개발 용이성 등의 기능을 제공하므로 백엔드 프레임워크로 사용할 수 있습니다.

nodejs를 mysql 데이터베이스에 연결하는 방법 nodejs를 mysql 데이터베이스에 연결하는 방법 Apr 21, 2024 am 06:13 AM

MySQL 데이터베이스에 연결하려면 다음 단계를 따라야 합니다. mysql2 드라이버를 설치합니다. mysql2.createConnection()을 사용하여 호스트 주소, 포트, 사용자 이름, 비밀번호 및 데이터베이스 이름이 포함된 연결 개체를 만듭니다. 쿼리를 수행하려면 Connection.query()를 사용하세요. 마지막으로 Connection.end()를 사용하여 연결을 종료합니다.

nodejs의 전역 변수는 무엇입니까 nodejs의 전역 변수는 무엇입니까 Apr 21, 2024 am 04:54 AM

Node.js에는 다음과 같은 전역 변수가 존재합니다. 전역 개체: 전역 핵심 모듈: 프로세스, 콘솔, 필수 런타임 환경 변수: __dirname, __filename, __line, __column 상수: undefine, null, NaN, Infinity, -Infinity

nodejs 설치 디렉토리에 있는 npm과 npm.cmd 파일의 차이점은 무엇입니까? nodejs 설치 디렉토리에 있는 npm과 npm.cmd 파일의 차이점은 무엇입니까? Apr 21, 2024 am 05:18 AM

Node.js 설치 디렉터리에는 npm과 npm.cmd라는 두 가지 npm 관련 파일이 있습니다. 차이점은 다음과 같습니다. 확장자가 다릅니다. npm은 실행 파일이고 npm.cmd는 명령 창 바로 가기입니다. Windows 사용자: npm.cmd는 명령 프롬프트에서 사용할 수 있으며, npm은 명령줄에서만 실행할 수 있습니다. 호환성: npm.cmd는 Windows 시스템에만 해당되며 npm은 크로스 플랫폼에서 사용할 수 있습니다. 사용 권장사항: Windows 사용자는 npm.cmd를 사용하고, 기타 운영 체제는 npm을 사용합니다.

nodejs와 java 사이에 큰 차이가 있나요? nodejs와 java 사이에 큰 차이가 있나요? Apr 21, 2024 am 06:12 AM

Node.js와 Java의 주요 차이점은 디자인과 기능입니다. 이벤트 중심 대 스레드 중심: Node.js는 이벤트 중심이고 Java는 스레드 중심입니다. 단일 스레드 대 다중 스레드: Node.js는 단일 스레드 이벤트 루프를 사용하고 Java는 다중 스레드 아키텍처를 사용합니다. 런타임 환경: Node.js는 V8 JavaScript 엔진에서 실행되는 반면 Java는 JVM에서 실행됩니다. 구문: Node.js는 JavaScript 구문을 사용하고 Java는 Java 구문을 사용합니다. 목적: Node.js는 I/O 집약적인 작업에 적합한 반면, Java는 대규모 엔터프라이즈 애플리케이션에 적합합니다.

nodejs는 백엔드 개발 언어인가요? nodejs는 백엔드 개발 언어인가요? Apr 21, 2024 am 05:09 AM

예, Node.js는 백엔드 개발 언어입니다. 서버 측 비즈니스 로직 처리, 데이터베이스 연결 관리, API 제공 등 백엔드 개발에 사용됩니다.

nodejs 프로젝트를 서버에 배포하는 방법 nodejs 프로젝트를 서버에 배포하는 방법 Apr 21, 2024 am 04:40 AM

Node.js 프로젝트의 서버 배포 단계: 배포 환경 준비: 서버 액세스 권한 획득, Node.js 설치, Git 저장소 설정. 애플리케이션 빌드: npm run build를 사용하여 배포 가능한 코드와 종속성을 생성합니다. Git 또는 파일 전송 프로토콜을 통해 서버에 코드를 업로드합니다. 종속성 설치: SSH를 서버에 연결하고 npm install을 사용하여 애플리케이션 종속성을 설치합니다. 애플리케이션 시작: node index.js와 같은 명령을 사용하여 애플리케이션을 시작하거나 pm2와 같은 프로세스 관리자를 사용합니다. 역방향 프록시 구성(선택 사항): Nginx 또는 Apache와 같은 역방향 프록시를 사용하여 트래픽을 애플리케이션으로 라우팅합니다.

nodejs와 java 중 어느 것을 선택해야 합니까? nodejs와 java 중 어느 것을 선택해야 합니까? Apr 21, 2024 am 04:40 AM

Node.js와 Java는 각각 웹 개발에 장단점이 있으며 선택은 프로젝트 요구 사항에 따라 다릅니다. Node.js는 실시간 애플리케이션, 신속한 개발 및 마이크로서비스 아키텍처에 탁월한 반면, Java는 엔터프라이즈급 지원, 성능 및 보안에 탁월합니다.

See all articles