下单

通过下单获取prepay_id,然后返回给小程序发起支付

若是服务商,mch_id:传入服务的商户号;sub_mch_id:传入子商户的商户号,算法签名的秘钥是服务商的秘钥。

'use strict';

const Service = require('egg').Service;

class wxPayment extends Service {
// 小程序支付
async unifiedorder(data) {
const { ctx } = this; const wxpayUitls = ctx.service.payment.helper.paymentUitls;
// 微信支付调用ip
const ip = ctx.request.ip.replace(/::ffff:/, ''); const params = {
// 小程序appid
appid: this.config.wxampPayConfig.appid,
// 商户号
mch_id: this.config.wechatPayConfig.mch_id,
// 子商户号
sub_mch_id: this.config.wechatPayConfig.sub_mch_id,
// 32位以内随机字符串
nonce_str: wxpayUitls.createNonceStr(),
// 商品描述
body: data.body,
// 商户订单号,32个字符内
out_trade_no: wxpayUitls.getTradeNo(),
// 金额,分;正式上线时启用
// total_fee: wxpayUitls.regYuanToFen(data.total, 100),
total_fee: 1,
// 终端ip
spbill_create_ip: ip,
// 通知地址
notify_url: 'http://baidu.com', // 交易类型
trade_type: 'JSAPI',
// 用户标识
openid: data.openID,
}; // 算法签名,传入参数及服务商商户的秘钥
params.sign = wxpayUitls.getSign(params, this.config.wechatPayConfig.wxPaykey);
const url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
const res = await ctx.curl(url, {
method: 'POST',
dataType: 'text/xml', // 注意接口数据类型
data: wxpayUitls.createXML(params), // 动态生成的xml
}); const result = await wxpayUitls.parserXML(res.data.toString()); // 返回的参数
const r = {
appId: this.config.wxampPayConfig.appid, // 当前小程序的appid
timeStamp: wxpayUitls.createTimeStamp(), // 注意类型String
nonceStr: result.xml.nonce_str,
package: 'prepay_id=' + result.xml.prepay_id,
signType: 'MD5',
};
r.paySign = wxpayUitls.getSign(r, this.config.wechatPayConfig.wxPaykey);
r.tradeNo = params.out_trade_no;
return r;
}
} module.exports = wxPayment;

helper.js

'use strict';
// eslint-disable-next-line strict
const QueryString = require('querystring');
const Crypto = require('crypto');
const XmlToJs = require('xml2js');
exports.paymentUitls = {
// 订单号
getTradeNo: () => {
let No = '';
for (let i = 0; i < 5; i++) {
No += Math.floor(Math.random() * 10);
}
No = new Date().getTime() + No;
return No;
}, /**
* 元的转化
* @param yuan {number} 金额
* @param digit {number} 放大倍数,如果元转分则为100
* */
regYuanToFen(yuan, digit) {
let m = 0;
const s1 = yuan.toString();
const s2 = digit.toString();
try { m += s1.split('.')[1].length;
m += s2.split('.')[1].length; } catch (e) {
// console.log(e);
} return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m);
},
// 时间戳产生函数
createTimeStamp() {
return parseInt(new Date().getTime() / 1000) + '';
}, // 生成随机的NonceStr,随机字符串,不长于32位。
createNonceStr: () => {
return Math.random()
.toString(36)
.substr(2, 15);
}, // 获取微信支付的签名
/**
* @param signParams {object} 请求参数的集合
* @param key {string} 商户号
* */
getSign: (signParams, key) => {
// 按 key 值的ascll 排序
let keys = Object.keys(signParams);
keys = keys.sort();
const newArguments = {};
// eslint-disable-next-line no-unused-vars
keys.forEach(function(val, key) {
if (signParams[val]) {
newArguments[val] = signParams[val];
}
}); const string = QueryString.stringify(newArguments) + '&key=' + key;
// 生成签名
return Crypto.createHash('md5')
.update(QueryString.unescape(string), 'utf8')
.digest('hex')
.toUpperCase();
},
// 根据对象生成xml
createXML: params => {
const builder = new XmlToJs.Builder();
return builder.buildObject(params);
},
// 解析xml
parserXML: xml => {
const Parser = new XmlToJs.Parser({ explicitArray: false, ignoreAttrs: false });
return new Promise((resolve, reject) => {
Parser.parseString(xml, function(err, result) {
if (err) reject(err);
resolve(result);
});
});
},
};

微信小程序获取返回的prepay_id,发起支付

// 发起支付
wx.requestPayment({
timeStamp: r.data.result.timeStamp,
nonceStr: r.data.result.nonceStr,
package: r.data.result.package,
signType: 'MD5',
paySign: r.data.result.paySign,
success(res) {
console.log('成功', res)
},
fail(res) { }
})

欢迎关注公众号【无聊猿】,共同学习探讨

egg微信小程序支付(服务商)插件封装的更多相关文章

  1. 微信小程序支付及退款流程详解

    微信小程序的支付和退款流程 近期在做微信小程序时,涉及到了小程序的支付和退款流程,所以也大概的将这方面的东西看了一个遍,就在这篇博客里总结一下. 首先说明一下,微信小程序支付的主要逻辑集中在后端,前端 ...

  2. php对接微信小程序支付

    前言:这里我就假装你已经注册了微信小程序,并且基本的配置都已经好了.注: 个人注册小程序不支持微信支付,所以我还是假装你是企业或者个体工商户的微信小程序,其他的商户号注册,二者绑定,授权,支付开通,就 ...

  3. 微信小程序支付接入注意点

    一.微信支付后台服务器部署 服务器采用ubuntu16.04 + php7.0 + apache2.0. 微信支付后台服务使用了curl 和 samplexml ,因此php.ini配置中必须开启这两 ...

  4. 微信小程序支付开发之申请退款

    微信小程序支付跟微信公众号支付类似,这里不另做记录,如果没有开发过支付,可以查看我关于微信支付的文章 重点记录微信小程序申请退款开发过程中遇到一些坑. 退款接口比支付接口接口多了一个 双向证书 证书介 ...

  5. 微信小程序支付接入实战

    1. 微信小程序支付接入实战 1.1. 需求   最近接到一个小程序微信支付的需求,需要我写后台支持,本着能不自己写就不自己写的cv原则,在网上找到了些第三方程序,经过尝试后,最后决定了这不要脸作者的 ...

  6. Java实现微信小程序支付(完整版)

    在开发微信小程序支付的功能前,我们先熟悉下微信小程序支付的业务流程图: 不熟悉流程的建议还是仔细阅读微信官方的开发者文档. 一,准备工作 事先需要申请企业版小程序,并开通“微信支付”(即商户功能).并 ...

  7. php 微信小程序支付

    php 微信小程序支付 直接贴代码: 前端测试按钮wxml: <view class="container"> <text class="name&qu ...

  8. .Net后台实现微信小程序支付

    最近一直再研究微信支付和支付宝支付,官方支付文档中一直在讲与第三方支付打交道的原理,却没有介绍我们自己项目中的APP与后台该怎么交互(哈哈,人家也没必要介绍这一块).拜读了官方文档和前辈们的佳作,自己 ...

  9. 微信小程序支付(企业支付给用户零钱)

    内容摘要:本案例客户端支付方式为微信小程序支付(JSAPI).商户运营一段时间后,在微信商户平台开通企业支付服务后,即可调用微信支付提供的企业付款接口将佣金等金额通过微信零钱返现给C端用户零钱. 服务 ...

随机推荐

  1. css自定义属性(css变量)

    感谢原文作者:Kuku殿下 原文链接:https://segmentfault.com/a/1190000015948538 前言 刚开始的"css变量",经扩展之后,称为&quo ...

  2. Idea 中使用Lombok找不到其自动生成的方法

    问题描述 在我的Idea已经安装Lombok插件还有已经导入Lombok jar包依赖的情况下,仍然找不到其自动生成的方法. 问题分析 从各方大佬那里得知,Lombok通过Pluggable Anno ...

  3. Mac 配置Apache Php编译ssl错误解决

    终端 Php编译错误解决 //错误信息 unable to connect to ssl://gateway.sandbox.push.apple.com:2195 (Unknown error) i ...

  4. 06 前端之Bootstrap框架

    目录 前端之Bootstrap框架 一.简介 二.引入方式 本地引入(最完整的) CDN引入 三.布局容器 四.栅格系统 五.列偏移 六.表格与表单 6.1表格 6.2表单form 七.按钮 预定义样 ...

  5. Solution -「APIO/CTSC 2007」「洛谷 P3620」数据备份

    \(\mathcal{Description}\)   Link.   给定升序序列 \(\{x_n\}\) 以及整数 \(k\),在 \(\{x_n\}\) 中选出恰 \(k\) 对 \((x_i, ...

  6. CentOS7编译安装升级openssh8.7p1

    因生成环境服务器安全扫描出的漏洞问题,只能升级最新的openssh,适用于centos6和centos7的升级使用. 一.编译前工作 openssl版本要求1.0.1以上,zlib版本要求1.1.4以 ...

  7. IDEA 2021 没有Allow parallel run

    IDEA 2021 没有Allow parallel run 尝试运行多个客户端. 新版IDEA找不到Allow parallel run

  8. XXE外部实体注入漏洞总结

    XXE 漏洞原理 XXE是xml外部实体注入漏洞,应用程序解析xml输入时,没有禁止外部实体的加载,导致可加载恶意外部文件和代码,造成任意文件读取,命令执行,内网端口扫描攻击内网网站等危害. 漏洞危害 ...

  9. 解决UIWebView内存不释放问题

    走访很多朋友,查阅了很多资料发现UIWebView这尼玛就是个坑,有人说是sdk自带的bug....... 所以一个新的方法诞生了#import <WebKit/WebKit.h> WKW ...

  10. systemd配置文件填写了ExecStop=/usr/bin/kill -9 $MAINPID之后重启在messages发生了报错

    原因在于systemd模块需要增加自动化检测,检测有一项为检测messages日志内是否有systemd的failed 写了一个检测脚本,脚本的检测messages内容为/bin/cat /var/l ...