这个是抖音小程序,接入担保支付的C#代码demo案例
由于官方只提供了java,php等语言的demo,特此分享一个C#版本
//首先声明三个类,用来组装data
public class requestOrderData
{
public List<skuListData> skuList;
public string outOrderNo;
public int totalAmount;
public string payNotifyUrl;
public orderEntrySchemaData orderEntrySchema;
}
public class skuListData
{
public string skuId;
public int price;
public int quantity;
public string title;
public List<string> imageList;
public int type;
public string tagGroupId;
}
public class orderEntrySchemaData
{
public string path;
public string @params;
}
public void ProcessRequest(HttpContext context){
requestOrderData requestOrder = new requestOrderData();
List<skuListData> skuList = new List<skuListData>();
orderEntrySchemaData orderEntrySchema = new orderEntrySchemaData();
List<string> imageList = new List<string>();
skuListData skuListData = new skuListData();
skuListData.skuId = 商品号;
skuListData.price = 价格;
skuListData.quantity = 数量;
skuListData.title = 商品标题;
imageList.Add("订单图片");
skuListData.imageList = imageList;
skuListData.type = 看官方文档;
skuListData.tagGroupId = 看官方文档;
skuList.Add(skuListData);
requestOrder.skuList = skuList;
requestOrder.outOrderNo = out_order_no;
requestOrder.totalAmount = total_amount;
requestOrder.payNotifyUrl = "支付成功的回调URL";
orderEntrySchema.path = "pages/index/watchVideo0";
orderEntrySchema.@params = "{\"ID\":"+video.ID+"}";
requestOrder.orderEntrySchema = orderEntrySchema;
//requestOrder组装完成,接下来准备签名
var ts = GetTimeStamp().ToString();//获取当前时间戳
List<string> paramsDict = new List<string>();//按照官方文档进行组装
paramsDict.Add("POST");
paramsDict.Add("/requestOrder");
paramsDict.Add(ts);
paramsDict.Add(out_order_no);
var sign = GetSign(paramsDict, requestOrder);//开始进行签名
var data = JsonConvert.SerializeObject(paramsDict);
//然后把结果返回给前端即可
context.Response.Write(JsonConvert.SerializeObject(new
{
requestOrder = JsonConvert.SerializeObject(requestOrder),
sign = $"SHA256-RSA2048 appid=\"{appid}\",nonce_str=\"{out_order_no}\",timestamp=\"{ts}\",key_version=\"{1}\",signature=\"{sign}\""
}));
}
public static long GetTimeStamp(bool isMillisecond = false)
{
var ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
var timeStamp = isMillisecond ? Convert.ToInt64(ts.TotalMilliseconds) :
Convert.ToInt64(ts.TotalSeconds); return timeStamp;
}
//获取签名的函数
private static string GetSign(List<string> data, requestOrderData data2)
{
var signStr = "";
foreach (var item in data)
{
signStr += item + "\n";
}
signStr += JsonConvert.SerializeObject(data2) + "\n";
return GetS(signStr);
}
//继续计算
private static string GetS(string sDataIn)
{
var privateKeyStr = @"-----BEGIN PRIVATE KEY-----
M.....这里填写你的私钥.......ul0rqAcEUdz+tAoGBAMwlik65msiaIF4kTUR+
ER7gS8lBPMosZeigi/2QLWDZw1OUIqjlwiQYB/A9M0J9q1bD3P5stwQtYLSk1W39
Qfk0mNN+NLVjhq04deYDLN1hDoUZLaRyTMXyiq3q1G9oR1nw7Vu5CvoBbvn3Xt+Z
QnDh5OhxO31I6O4gz4s9xba9
-----END PRIVATE KEY-----";
// 将PEM格式的私钥字符串解析为RsaKeyParameters
TextReader privateKeyTextReader = new StringReader(privateKeyStr);
PemReader pemReader = new PemReader(privateKeyTextReader);
RsaKeyParameters privateKeyParams = (RsaKeyParameters)pemReader.ReadObject();
// 创建SHA256的签名器
ISigner signer = SignerUtilities.GetSigner("SHA-256withRSA");
// 使用私钥初始化签名器
signer.Init(true, privateKeyParams);
byte[] data = Encoding.UTF8.GetBytes(sDataIn);
// 更新签名器的数据
signer.BlockUpdate(data, 0, data.Length);
// 计算签名
byte[] signature = signer.GenerateSignature();
// 将签名进行Base64编码
string base64Signature = Convert.ToBase64String(signature);
return base64Signature;
}