首页 > 编程语言 >抖音小程序支付开发

抖音小程序支付开发

时间:2022-08-14 20:56:58浏览次数:77  
标签:string 程序 System value 抖音 支付 var using data

1、签名工具类

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace Common.Utils
{
    /// <summary>
    /// 字节跳动小程序签名
    /// </summary>
    public class TiktokAppSignUtil
    {
        // 支付宝支付密钥值
        private const string Salt = "";


        public static string GetSign(Dictionary<string, Object> paramsDict)
        {
            var paramsList = new ArrayList();
            foreach (var item in paramsDict)
            {
                var k = item.Key;
                var v = item.Value;
                if ("other_settle_params".Equals(k))
                {
                    continue;
                }

                var value = v.ToString().Trim();
                if (value.StartsWith("\"") && value.EndsWith("\"") && value.Length > 1)
                {
                    value = value.Substring(1, value.Length - 1);
                }

                value = value.Trim();
                if ("".Equals(value) || "null".Equals(value))
                {
                    continue;
                }

                switch (k)
                {
                    case "app_id":
                    case "thirdparty_id":
                    case "sign":
                        break;
                    default:
                        paramsList.Add(value);
                        break;
                }
            }

            paramsList.Add(Salt);
            // 按照 ASCII 编码进行排序
            var paramsArray = (string[])paramsList.ToArray(typeof(string));
            Array.Sort(paramsArray, string.CompareOrdinal);
            var signStr = string.Join("&", paramsArray);

            return GetMd5(signStr);
        }

        private static string GetMd5(string sDataIn)
        {
            var md5 = new MD5CryptoServiceProvider();
            byte[] bytValue, bytHash;
            bytValue = Encoding.UTF8.GetBytes(sDataIn);
            bytHash = md5.ComputeHash(bytValue);
            md5.Clear();
            var sTemp = bytHash.Aggregate("", (current, t) => current + t.ToString("X").PadLeft(2, '0'));

            return sTemp.ToLower();
        }
    }
}

2、下订单工具类

using Common.TiktokAppPay.Models;

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

namespace Common.Utils
{
    /// <summary>
    /// 抖音支付工具
    /// </summary>
    public class TiktokAppPayUtil
    {
        public static string AppId { get; set; } = "";

        /// <summary>
        /// 预下单
        /// </summary>
        public static string CreateOrder(string subject, string body, decimal amount)
        {
            string url = "https://developer.toutiao.com/api/apps/ecpay/v1/create_order";

            CreateOrderRequest requestData = new CreateOrderRequest
            {
                app_id = AppId,
                out_order_no = Guid.NewGuid().ToString(),
                total_amount = (int)1,
                subject = subject,
                body = body,
                valid_time = 172800,

            };

            requestData.sign = TiktokAppSignUtil.GetSign(DictUtil.ModelToMap(requestData));

            string postData = JsonConvert.SerializeObject(requestData);

            return Post(url, postData);

        }

        private static string Post(string url, string postData)
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.ContentType = "application/json";
            request.UserAgent = "Mozilla / 5.0(Windows NT 10.0; Win64; x64; rv: 48.0) Gecko / 20100101 Firefox / 48.0"; //火狐用户代理
            request.Method = "POST";


            byte[] data = Encoding.UTF8.GetBytes(postData);
            request.ContentLength = data.Length;

            using (Stream reqStream = request.GetRequestStream())
            {
                reqStream.Write(data, 0, data.Length);
                reqStream.Close();
            }

            HttpWebResponse resp = (HttpWebResponse)request.GetResponse();
            Stream stream = resp.GetResponseStream();
            //获取响应内容
            string result = "";
            using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
            {
                result = reader.ReadToEnd();
            }
            return result;
        }
    }
}

3、小程序前端先调用预订单生成,生成成功后打开收银台

uni.request({
                    url:  baseUrl+'/api/TiktokAppPay/CreateOrder?ProductId=' + this.ProductId,
                    method:"POST",
                    success: (res) => {
                        var data= JSON.parse(res.data);
                        if (data.err_no == 0) {
                            var data = data.data;
                            tt.pay({
                                orderInfo: {
                                    order_id: data.order_id,
                                    order_token: data.order_token,
                                },
                                service: 5,
                                success(res) {
                                    if (res.code == 0) {
                                        // 支付成功处理逻辑,只有res.code=0时,才表示支付成功
                                        // 但是最终状态要以商户后端结果为准
                                        uni.showToast({
                                            title: "支付成功"
                                        });
                                    }
                                },
                                fail(res) {
                                    uni.showToast({
                                        title: "支付失败"
                                    });
                                    // 调起收银台失败处理逻辑
                                },
                            });
                        } else {
                            uni.showToast({
                                title: res.err_tips
                            });
                        }
                    },
                    fail: () => {
                        console.log('fail');
                    }
                })
            }

 

标签:string,程序,System,value,抖音,支付,var,using,data
From: https://www.cnblogs.com/tangchun/p/16586289.html

相关文章

  • 戏开发程序岗面试题答案版(一)-- C++篇
     游戏开发程序岗面试题答案版C++篇, 后续继续更新游戏逻辑篇、unity篇、图形学篇,并整理成文档,可在公号【游戏君五尘】获取。 网页排版排版较乱,原文链接游戏开......
  • 小程序uni-app发起网络异步请求
    //uni.request({ // url:'api/boxs/search', // //使用监听函数防止this指向改变 // success:res=>{ // //判断是否成功返回数据 // if(res......
  • 微信小程序生命周期,冷热重载的区别
    微信小程序的生命周期分为两个级别:APP.JS里面的是小程序的生命周期,也就是应用生命周期:App()函数用来注册一个小程序。接受一个object参数,其指定小程序的生命周期函数......
  • uniapp顶部搜索图标实现(App端,小程序不支持)
    这两个部位的图标可以在page.json中配置,不需要单独编写(小程序中需要手动编写,通过flex布局实现)1、在pages.json中的pages-->style-->app-plus中添加titleNView2、font......
  • 使用WinDbg调试程序异常和死锁等问题
    一、在使用WinDbg调试之前,我们先使用VS的调试功能1、文件->打开->文件->打开Dump文件 2、调试->选项->调试->符号->添加该应用的.pdb所在的......
  • [c++] windows下检查当前程序是不是以管理员权限运行
    很多程序运行的时候,一些操作需要管理员权限才能运行,正好微软提供了一个接口IsUserAnAdmin,可以让我们很方便的检测出当前程序是不是以admin运行的。#include<ShlObj.h>......
  • 版本与发布-微信小程序开发(三十一 )
    软件开发过程中的不同版本在软件开发过程中,根据时间节点的不同,会产出不同的软件版本,例如:①开发者编写代码的同时,对项目代码进行自测(开发版本)②直到程序达到一个稳定可......
  • WebStrom开发微信小程序,基本配置
    WebStrom开发微信小程序,基本配置注意默认情况下,webstorm不支持wxml和wxss的文件类型,所以需要手动去配置。我们只需要配置.wxml和.wxss:识别为:.wxml->html.wxss->css......
  • 自定义组件⑦插槽-微信小程序开发(二十四)
    1.什么是插槽在自定义组件的wxml结构中,可以提供一个节点(插槽),用于承载组件使用者提供的wxml结构。2.单个插槽在小程序中,默认每个自定义组件中只允许使用一个......
  • 自定义组件⑤纯数据字段-微信小程序开发(二十二)
    1.什么是纯数据字段概念:纯数据字段指的是那些不用于界面渲染的data字段。应用场景:例如有些情况下,某些data中的字段既不会展示在界面上,也不会传递给其他组件,仅仅在当......