• Node.js 支付宝支付


    1. /**
    2. * 统一下单
    3. * @param ctx
    4. * 商户订单号 - outTradeNo
    5. * 订单总金额 - totalAmount
    6. * 订单标题 - subject
    7. */
    8. async pcpay(ctx) {
    9. console.log("统一下单:" + JSON.stringify(ctx.request.body));
    10. let outTradeNo = ctx.request.body.outTradeNo;
    11. let totalAmount = ctx.request.body.totalAmount;
    12. let subject = ctx.request.body.subject;
    13. // 填写订单基础信息
    14. const bizContent = {
    15. product_code: "FAST_INSTANT_TRADE_PAY",
    16. out_trade_no: outTradeNo,
    17. total_amount: totalAmount,
    18. subject: subject
    19. }
    20. // 获取支付宝官方支付链接
    21. const formData = new AlipayFormData();
    22. formData.setMethod("get");
    23. formData.addField("bizContent", bizContent);
    24. //支付成功或失败的返回链接
    25. formData.addField("returnUrl", "http://qjzjne.natappfree.cc/api/payment/callback");
    26. let message = "下单成功";
    27. const resultUrl = await alipaySdk.exec(
    28. "alipay.trade.page.pay",
    29. {},
    30. { formData: formData }
    31. ).catch(error => console.error('订单生成失败!', error), message = "订单生成失败!" );
    32. //保存订单数据
    33. const data = {
    34. outTradeNo: outTradeNo,
    35. totalAmount: totalAmount,
    36. subject: subject,
    37. tradeStatus: 'WAIT_BUYER_PAY',
    38. }
    39. await strapi.entityService.create('api::payment.payment', { data: data });
    40. ctx.send({
    41. code: 200,
    42. url: resultUrl,
    43. message: message
    44. });
    45. },
    1. /**
    2. * 支付回调
    3. * @param ctx
    4. * 商户订单号 - outTradeNo
    5. * 平台订单号 - tradeNo
    6. */
    7. async callback(ctx) {
    8. console.log("支付回调:" + JSON.stringify(ctx.query));
    9. const signRes = alipaySdk.checkNotifySign(ctx.query);
    10. console.log("验签:"+signRes);
    11. const outTradeNo = ctx.query.out_trade_no;
    12. const tradeNo = ctx.query.trade_no;
    13. if(signRes){
    14. let message = "支付回调成功";
    15. const payments = await strapi.entityService.findMany(
    16. 'api::payment.payment',
    17. { filters: { outTradeNo: outTradeNo } }
    18. ).catch(error => console.error('支付回调失败!', error), message = "支付回调失败!" );
    19. let payment;
    20. if (payments || payments.length > 0) {
    21. payment = payments[0];
    22. }
    23. const entry = await strapi.entityService.update('api::payment.payment', payment.id, {
    24. data: {
    25. tradeNo: tradeNo,
    26. },
    27. });
    28. ctx.send({
    29. code: 200,
    30. data: entry,
    31. message: message
    32. });
    33. }else{
    34. ctx.send({
    35. code: 200,
    36. message: "验签失败"
    37. });
    38. }
    39. },
    1. /**
    2. * 订单查询
    3. * @param ctx
    4. * 商户订单号 - outTradeNo
    5. * 平台订单号 - tradeNo
    6. */
    7. async queryOrder(ctx) {
    8. console.log("订单查询:" + JSON.stringify(ctx.request.body));
    9. let outTradeNo = ctx.request.body.outTradeNo;
    10. let tradeNo = ctx.request.body.tradeNo;
    11. let message;
    12. const formData = new AlipayFormData();
    13. formData.setMethod("get");
    14. const bizContent = {
    15. outTradeNo,
    16. tradeNo
    17. };
    18. formData.addField("bizContent", bizContent);
    19. const queryResult = await alipaySdk.pageExec('alipay.trade.query', {
    20. method: 'GET',
    21. bizContent
    22. })
    23. const result = await axios.get(queryResult)
    24. const dataResult = result.data.alipay_trade_query_response;
    25. console.log("交易查询:" + JSON.stringify(dataResult))
    26. if (dataResult.code == 10000) {
    27. switch (dataResult.trade_status) {
    28. case 'WAIT_BUYER_PAY':
    29. message = "交易创建,等待买家付款"
    30. break;
    31. case 'TRADE_FINISHED':
    32. message = "交易结束,不可退款"
    33. break;
    34. case 'TRADE_SUCCESS':
    35. message = "交易支付成功"
    36. break;
    37. case 'TRADE_CLOSED':
    38. message = "未付款交易超时关闭,或支付完成后全额退款";
    39. break;
    40. }
    41. //更新交易状态值
    42. const payments = await strapi.entityService.findMany(
    43. 'api::payment.payment',
    44. { filters: { outTradeNo: outTradeNo } }
    45. );
    46. const entry = await strapi.entityService.update('api::payment.payment', payments[0].id, {
    47. data: {
    48. tradeStatus: dataResult.trade_status,
    49. },
    50. });
    51. ctx.send({
    52. code: 200,
    53. data: entry,
    54. message: message
    55. })
    56. } else if (dataResult.code == 40004) {
    57. ctx.send({
    58. code: 404,
    59. message: "交易不存在"
    60. })
    61. }
    62. }

    Demo下载地址:https://download.csdn.net/download/u013772876/88376302

  • 相关阅读:
    GO常用命令记录
    关于Async、Await的一些知识点
    Collection集合的常见使用(Java)
    CPU眼里的C/C++:1.2 查看变量和函数在内存中的存储位置
    十四、内置模块path、邂逅Webpack和打包过程、css-loader
    深度学习训练营之彩色图片分类
    小程序day02
    Spring5 学习笔记 五 、JdbcTemplate
    TVS二极管的小知识
    【前端笔记】HBuilderX通过微信开发者工具预览打开不了探索过程
  • 原文地址:https://blog.csdn.net/u013772876/article/details/133298647