小程序端,JS代碼如下:
makeoderinfo:function()//購物車過來的呢??///加個循環
{
var that=this;
var userinfo=app.globalData.users;//這不必須需要的,自己處理業務用
var temopenid=userinfo.openid;//這個必須的,要在微信登錄時,獲取
var temuserid=userinfo.userid;//這不必須需要的,自己處理業務用
var temtuserid=userinfo.Tuserid;//這不必須需要的,自己處理業務用
var goodsdata=app.globalData.selectgoodsdata;//這不必須需要的,自己處理業務用
var temgoodsid=goodsdata.selectgoodsdata.GoodsId;//這不必須需要的,自己處理業務用
var temgoodsname=goodsdata.selectgoodsdata.GoodsName;//這不必須需要的,自己處理業務用
var temshopid=goodsdata.selectgoodsdata.ShopId;//這不必須需要的,自己處理業務用
var temextendata=goodsdata.extendata;//這不必須需要的,自己處理業務用
var jsonstr= JSON.stringify(temextendata)//這不必須需要的,自己處理業務用
var temcouponrecord=[];//優惠記錄//這不必須需要的,自己處理業務用
var temaddressid="AD20210418773000000003";
var temusermess=that.data.usermessge;//用戶留言
var temcount=that.data.count;//這不必須需要的,自己處理業務用
var temexpress_cost=0;//快遞費
var temtotal=that.data.total;//訂單總金額
var temdtotal=that.data.total;//單個商品金額,暫時,還可加算法,單價*優惠——券等
var obj3={//這不必須需要的,自己處理業務用
CouponId:"123456",
Count:2
}
temcouponrecord.push(obj3)//這不必須需要的,自己處理業務用
temcouponrecord.push(obj3)//這不必須需要的,自己處理業務用
var obj1={ //前面的裝成一個類結構
Goodsid:temgoodsid,
Shopid:temshopid,
Goodsname:temgoodsname,
Dtotal:temdtotal*100,
Extendata:temextendata,
Couponrecord:temcouponrecord,
Express_cost:temexpress_cost,
count:temcount
};
var temgoodslist=[];//多種商品,做成一下數組,//這不必須需要的,自己處理業務用
temgoodslist.push(obj1)
var temobj2={ //這個是request,提交的數據結構
userid:temuserid,//三大ID
tuserid:temtuserid,//這不必須需要的,自己處理業務用
openid: temopenid,//必須的
description:temgoodsname,//必須的,名稱可隨意負值
addressid:temaddressid,//不是必須的
usermess:temusermess,//不是必須的
// count:temcount,
total:temtotal*100, 必須的,上傳的值,是分,1元的,上傳數值是100
goodslist:temgoodslist//不是必須的
}
return temobj2;
// app.globalData.selectgoodsdata=temobj;
},
//得到V3,統一下單
payment: function() {
var that=this;
var temdata=that.makeoderinfo();
console.log(temdata);
wx.request({
url: '***************/Paycom', //服務器接口地址
data:temdata,
method: 'GET',
header: {
'content-type': 'application/json'
},
success: function (param) {///param為服務器返回數據JSON結構
console.log(param);
wx.requestPayment /調用API,調起支付
({
"timeStamp": param.data.timeStamp,
"nonceStr": param.data.nonceStr,
"package": param.data.package,
"signType": "RSA",
"paySign": param.data.paySign,
success:function(res){
console.log(res);
},
fail:function(res){
console.log(res+"88888");
},
complete:function(res){
console.log(res+"9999");
}
}
)
},
fail: function(error) {
console.info(error);
}
})
},
C#后台處理
public Task<ActionResult> Paycom(int userid,string tuserid,string addressid,string usermess, string description, string openid, int total, string goodslist)//下單接口//正在使用
{
List<Recievmodle<Extendata<Extentype>, Couponrecord>> mylist = JsonConvert.DeserializeObject<List<Recievmodle<Extendata<Extentype>, Couponrecord>>>(goodslist);
Recievmodle<Extendata<Extentype>, Couponrecord> recievmodle = mylist[0];
var goodsid = recievmodle.Goodsid;
_logger.LogWarning("000000000000000");
//創建本地訂單數據結構
Order order = new Order();
order.OrderId = "00";
order.UserId = tuserid;
order.AddressId = addressid;
order.Want_Payer_Total = total;
order.AddTime = DateTime.Now;
_orderService.Add(order);
string tzstr1 = "P";
string tzstr2 = order.Id.ToString();
string temorderid = MakeSerial_no(tzstr1, tzstr2);
order.OrderId = temorderid;
_orderService.Save(order);
string backstr = Create_Order_Goods(order.OrderId, tuserid, addressid, usermess, goodslist);//創建order_goods記錄//
///*************前面都是自己的業務處理,只為得到temordeid,,其它都是小程序傳過來的參數*********************************************************************/
return WxPay(description, openid, total, temorderid);去下單///
}
#region//V3微信支付統一下單
public async Task<ActionResult> WxPay(string description, string openid, int total, string temorderid)//v3,微信支付統一下單
{
var url = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi";/微信支付統一下單地址
var req = new GenerateOrderModelForWxPay 構建數據結構,要自己去創建一個類的哦
{
appid = Appid,自己的小程序ID
mchid = _mch_id,商戶號,必須的哦
description = description,隨意的貨物名
amount = new WxPayAmountModel /要自己去創建一個類的哦
{
total = total,
currency = "CNY"
},
payer = new WxPayerModel /要自己去創建一個類的哦
{
openid = openid
},
out_trade_no = temorderid,
notify_url = "********************/WxPayCallbackV3" 接收支付返回信息的接口,自己創建
};
string webHost = _hostingEnvironment.WebRootPath;服務器的物理地址
HttpClient client = new HttpClient(new HttpHandler(_mch_id, serialNo, webHost));
var bodyJson = new StringContent(JsonConvert.SerializeObject(req), Encoding.UTF8, "application/json"); //一定要這樣傳遞參數,不然在加密簽名的時候獲取到的參數就是\\u0這種形式的數據了,不是傳遞的這樣的數據了,導致加密的結果不正確
Console.WriteLine(bodyJson);
// var filepath= _hostingEnvironment.WebRootPath + "/arsjkll/apiclient_cert.p12";
var resp = await client.PostAsync(url, bodyJson);
_logger.LogWarning(bodyJson.ToString());
// 讀取統一下單之后的返回結果,這樣讀取出來的直接就是結果,或者錯誤原因,大家一定要這么搞啊!!!多么痛的領悟,會有具體的錯誤信息的。
var respStr = await resp.Content.ReadAsStringAsync();//這里面就包含prepay_id了
var result = JsonConvert.DeserializeObject<JsApiResult>(respStr);
if (!string.IsNullOrEmpty(result.Prepay_Id))
{
//時間戳
// DateTimeOffset dto = new DateTimeOffset(DateTime.Now);
// var unixTime = dto.ToUnixTimeSeconds().ToString();
var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds().ToString();
//隨機數
var nonMun = Guid.NewGuid().ToString("N").Substring(0, 30);
var pck = "prepay_id=" + result.Prepay_Id;
//簽名
string message = $"{Appid}\n{timestamp}\n{nonMun}\n{pck}\n";
var pathfile = _hostingEnvironment.WebRootPath + "/arsjkll/apiclient_cert.p12";
string keyRsa = SignF(message, pathfile, _mch_id);
//var keyRsa = _httpClientFactoryHelper.Sign(message, model.PrivateKey);
//構建JSAPI拉取支付的參數 匿名參數
// string keyRsa = Sign(message);
var requestParam = new
{
appId = Appid,
timeStamp = timestamp,
nonceStr = nonMun,
package = pck,
signType = "RSA",
paySign = keyRsa
};
// ReturnData returnData = ReturnData.ToSuccess(requestParam);
return Content(JsonHelper.Instance.Serialize(requestParam));
}
else
{
return Content("prepay_id獲取失敗+++++++" + respStr);
}
}
#endregion
可以掃小程序體驗
————————————————
版權聲明:本文為CSDN博主「liushiyi」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/liushiyi/article/details/119813550