【链接】单笔转账到支付宝账户产品介绍更新时间:
https://docs.open.alipay.com/309

const crypto = require('crypto')

const moment = require('moment')

1.返回给移动端签名字符串:

router.post('createAliPayment', async (ctx, next) => {
const orderInfo = await model.order.findOne({
'orderStatus.status': {
$in: [1, 9]
},
orderCode: ctx.params.orderCode,
createdBy: ctx.user.userid,
isDelete: false
}, {
_id: 0,
orderCode: 1,
transCode: 1,
orderProducts: 1,
CNYCharge: 1
})
if (!orderInfo) {
throw {
status: 20001,
message: 'paying orderInfo not exists'
}
return
}
let aliPaySignObj = {
app_id: '支付宝商户Id',
method: 'alipay.trade.app.pay',
charset: 'utf-8',
sign_type: 'RSA2',
timestamp: moment().format('YYYY-MM-DD HH:mm:ss'),
version: '1.0',
notify_url: `${config.notify_ulr}`,
biz_content: JSON.stringify({
body: '冰糖葫芦',
subject: '冰糖葫芦',
out_trade_no: orderInfo.orderCode,
timeout_express: '15m',
total_amount: Number(orderInfo.CNYCharge).toString(),
product_code: 'QUICK_MSECURITY_PAY'
})
};
let signStr = '',
encodeStr = '';
for (let n of Object.keys(aliPaySignObj).sort()) {
signStr += (n + '=' + aliPaySignObj[n] + '&');
encodeStr += (n + '=' + encodeURIComponent(aliPaySignObj[n]) + '&');
}
signStr = signStr.substring(0, signStr.length - 1);
var signer = crypto.createSign('RSA-SHA256').update(signStr);
let privateKey = fse.readFileSync(path.join(__dirname, '../alipay_private_key.pem')).toString();
let sign = signer.sign(privateKey, 'base64')
ctx.body = {
encodeStr: encodeStr + 'sign=' + encodeURIComponent(sign)
}
})

2.支付宝回调

router.post('notifyFromAliPay', async (ctx, next) => {
const resData = ctx.params;
if (!(resData && resData.trade_status && resData.trade_status == 'TRADE_SUCCESS')) {
ctx.body = 'fail';
return;
}
//1.验证签名信息
let signStr = '';
for (let n of Object.keys(resData).sort()) {
if (n !== 'sign' && n !== 'sign_type') {
signStr += (n + '=' + decodeURIComponent(resData[n]) + '&');
}
}
signStr = signStr.substring(0, signStr.length - 1);
let signer = crypto.createVerify('RSA-SHA256').update(signStr);
const aliPublicKey = fse.readFileSync(path.join(__dirname, "../alipay_public_key.pem")).toString();
const sign = signer.verify(aliPublicKey, resData.sign, 'base64');
if (!sign) {
ctx.body = 'fail';
return;
}
const orderCodePhoto = resData.out_trade_no;
const orderDb = await model.order.findOne({
orderCode: orderCodePhoto
}, {
_id: 0,
siteId: 1,
CNYCharge: 1,
usePPCodes: 1,
orderProducts: 1,
virtualProducts: 1,
createdBy: 1,
charge: 1
})
if (!orderDb) {
throw new Error('alipay notify orderCode not exists !')
}
let queryAlipayParams = {
app_id: '支付宝商户Id',
method: 'alipay.trade.query',
charset: 'utf-8',
sign_type: 'RSA2',
timestamp: moment().format('YYYY-MM-DD HH:mm:ss'),
version: '1.0',
biz_content: JSON.stringify({
out_trade_no: orderCodePhoto,
trade_no: resData.trade_no
})
}
let signString = '',
encodeStr = '';
for (let n of Object.keys(queryAlipayParams).sort()) {
signString += (n + '=' + queryAlipayParams[n] + '&');
encodeStr += (n + '=' + encodeURIComponent(queryAlipayParams[n]) + '&');
}
signString = signString.substring(0, signString.length - 1);
var signQuery = crypto.createSign('RSA-SHA256').update(signString);
let privateKey = fse.readFileSync(path.join(__dirname, '../alipay_private_key.pem')).toString();
let signrs = encodeURIComponent(signQuery.sign(privateKey, 'base64'));
const querParams = encodeStr + `sign=${signrs}`;
const queryAlipayResult = await request.getAsync({
url: 'https://openapi.alipay.com/gateway.do?' + querParams
})
const aplipayQueryResult = queryAlipayResult && JSON.parse(queryAlipayResult.body) || '';
if (!aplipayQueryResult) {
ctx.body = 'fail';
return;
}
const aplipayqr = aplipayQueryResult.alipay_trade_query_response;
if (!(aplipayqr.code == '10000' && aplipayqr.msg == 'Success' && aplipayqr.trade_status == 'TRADE_SUCCESS' && Number(aplipayqr.total_amount) == orderDb.CNYCharge)) {
ctx.body = 'fail';
return;
}
try {
ctx.body = 'success';
//更新业务操作
} catch (err) {
throw new Error(err)
}
}

总结:1.nodejs app支付,后端做的就是以上两步,剩下的就是app端的事了。

2.以上代码,复制,稍微改改就成了

nodejs 支付宝app支付的更多相关文章

  1. 支付宝APP支付开发- IOException : DER input, Integer tag error

    支付宝APP支付Java开发报错: 1 java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: I ...

  2. 支付宝APP支付开发- IOException : DerInputStream.getLength(): lengthTag=127, too big.

    支付宝APP支付Java开发报错: IOException : DerInputStream.getLength(): lengthTag=127, too big. 后来排查是因为没有设置私钥.

  3. 支付宝APP支付之Java后台生成签名具体步骤

    /** *支付宝支付 * @param orderId 订单编号 * @param actualPay 实际支付金额 * @return */ private String getOrderInfoB ...

  4. Android版-支付宝APP支付

    此项目已开源 赶快来围观 Start支持下吧 [客户端开源地址-JPay][服务端端开源地址-在com.javen.alipay 包名下] 上一篇详细介绍了微信APP支付 点击这里 此篇文章来详细介绍 ...

  5. H5使用codovar插件实现支付宝支付(支付宝APP支付模式,前端)

    H5打包的app实现支付及支付宝支付,本章主要详解支付宝支付,微信支付请查看另一篇“H5使用codovar插件实现微信支付(微信APP支付模式,前端)” ps:本文只试用H5开发的,支付宝 APP支付 ...

  6. 支付宝app支付服务端流程

    支付宝APP支付服务端详解 前面接了微信支付,相比微信支付,支付宝APP支付提供了支付封装类,下面将实现支付宝APP支付.订单查询.支付结果异步通知.APP支付申请参数说明,以及服务端返回APP端发起 ...

  7. 微信、支付宝App支付-JPay0.0.2发布

    JPay 对微信App支付.支付宝App支付的二次封装,对外提供一个相对简单的接口以及支付结果的回调 GitHub:https://github.com/Javen205/JPay OsChina:h ...

  8. 支付宝app支付java后台流程、原理分析(含nei wang chuan tou)

    java版支付宝app支付流程及原理分析 本实例是基于springmvc框架编写     一.流程步骤         1.执行流程           当手机端app(就是你公司开发的app)在支付 ...

  9. 支付宝APP支付IOS手机端java后台版

    版权声明:http://blog.csdn.net/u012131769/article/details/76639527#t8 转载:http://blog.csdn.net/u012131769/ ...

随机推荐

  1. FFmpeg 常用指令集合

    不精确裁剪视频 # -ss 指定从什么时间开始 # -t 指定需要截取多长时间 # -i 指定输入文件 ffmpeg -ss 00:00:00 -t 00:00:30 -i test.mp4 -vco ...

  2. spring cloud Hystrix监控面板Hystrix Dashboard和Turbine

    我们提到断路器是根据一段时间窗内的请求情况来判断并操作断路器的打开和关闭状态的.而这些请求情况的指标信息都是HystrixCommand和HystrixObservableCommand实例在执行过程 ...

  3. 论文阅读笔记五:U-Net: Convolutional Networks for Biomedical Image Segmentation(CVPR2015)

    前面介绍了两个文本检测的网络,分别为RRCNN和CTPN,接下来鄙人会介绍语义分割的一些经典网络,同样也是论文+代码实现的过程,这里记录一下自己学到的东西,首先从论文下手吧. 英文论文原文地址:htt ...

  4. 饮冰三年-人工智能-linux-09 服务

    1:SSH服务(提供远程连接服务) 客户端使用Xshell 链接成功 加快连接速度 关闭防火墙 2:apache 服务(提供网页服务) 2.0 准备环境 关闭防火墙:service iptables ...

  5. 编写UEditor插件

    UE.registerUI('beijing', function (editor, uiName) { // 注册按钮执行时的command命令 editor.registerCommand(uiN ...

  6. Android之Error: 'L' is not a valid file-based resource name character解决办法

    1.问题 Error:Execution failed for task ':mergeBYODReleaseResources'.> /home/chenyu/Android_dev/sang ...

  7. Note for "Some Remarks on Writing Mathematical Proofs"

    John M. Lee is a famous mathematician, who bears the reputation of writing the classical book " ...

  8. JMeter实现Oracle参数化(1)

    http://www.ithao123.cn/content-10469577.html

  9. python--实践--模拟浏览器(http)登陆

    #方法一:直接使用coookies登陆,此方法需要提前在浏览器中使用账号密码登陆后,获取浏览器中的cookies,在构造的请求中携带这个cookies(缺点是有时效性). #方法二:通过账号密码(Fr ...

  10. 2018牛客网暑假ACM多校训练赛(第四场)A Ternary String 数论

    原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round4-A.html 题目传送门 - https://www.no ...