小程序端,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