最近在为公司做个有关于公益的微信小程序,说实在话做小程序我还是第一次。对于小程序怎么开发一窍不通,那能怎么办呢?只能肯文档呗!刚开始啥都不懂,只能边看文档边问人,不过还好没什么难点,看了一个下午,第二天就开始动手了。
不过好在我只是写后端接口而已,开发这个的难点在于微信支付这一块,没接触过,有点不知道怎么下手!那继续肯文档吧!还好支付这一块写两个接口就行了,一个是微信支付接口(也就是:统一下单接口),另一个则是微信支付回调接口。
废话不多说赶紧上码,才是王道!!!
第一个:微信支付接口
/// <summary>
/// 微信支付
/// </summary>
[Route("api/[controller]")]
public class WechatPayController : Controller
{
private IHttpContextAccessor _accessor;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="accessor"></param>
public WechatPayController(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
/// <summary>
/// 微信支付
/// </summary>
/// <param name="temp"></param>
/// <returns></returns>
/// <response code="200">微信下单成功</response>
/// <response code="600"></response>
/// <response code="601">微信下单失败</response>
[HttpPost]
[Route("GetUnifiedOrderResult")]
public CommonResult<OrderResult> GetUnifiedOrderResult([FromBody] GetUnifiedOrderResult temp)
{
var result = new CommonResult<OrderResult>();
/*
可以在这里执行一些自己的逻辑代码
*/
//统一下单
WxPayData data = new WxPayData();
data.SetValue("body", "某某某");
data.SetValue("attach", temp.GYID.ToString());
data.SetValue("out_trade_no", GenerateOutTradeNo());
//data.SetValue("total_fee", re.Price.ToString());//支付金额 /分
data.SetValue("total_fee", "1");
var timeStamp = DateTime.Now.ToString("yyyyMMddHHmmss");
data.SetValue("time_start", timeStamp);
data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));
//data.SetValue("goods_tag", "test");//订单优惠标记
data.SetValue("trade_type", "JSAPI");//交易类型
data.SetValue("openid", user.Openid);
data.SetValue("notify_url", WxConfig.NOTIFY_URL);
WxPayData wxdata = UnifiedOrder(data);
if (!wxdata.IsSet("appid") || !wxdata.IsSet("prepay_id") || wxdata.GetValue("prepay_id").ToString() == "")
{
result.scode = "601";
result.remark = "微信下单失败";
return result;
}
wxdata.GetValue("appid");
result.scode = "200";
result.remark = "微信下单成功";
OrderResult or = new OrderResult();
string nodestr = wxdata.GetValue("nonce_str").ToString();
string prepay_id = wxdata.GetValue("prepay_id").ToString();
string paySign = GetPaySign(timeStamp, nodestr, prepay_id);
or.TimeStamp = timeStamp;
or.Err_code = wxdata.IsSet("err_code") ? wxdata.GetValue("err_code").ToString() : "";
or.Err_code_des = wxdata.IsSet("err_code_des") ? wxdata.GetValue("err_code_des").ToString() : "";
or.PaySign = paySign;
or.Return_code = wxdata.GetValue("return_code").ToString();
or.Return_msg = wxdata.GetValue("return_msg").ToString();
or.Appid = wxdata.GetValue("appid").ToString();
or.Prepay_id = prepay_id;
or.NonceStr = nodestr;
result.result = or;
return result;
}
/**
*
* 统一下单
* @param WxPaydata inputObj 提交给统一下单API的参数
* @param int timeOut 超时时间
* @throws WxPayException
* @return 成功时返回,其他抛异常
*/
private WxPayData UnifiedOrder(WxPayData inputObj)
{
string url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
//检测必填参数
if (!inputObj.IsSet("out_trade_no"))
{
throw new WxPayException("缺少统一支付接口必填参数out_trade_no!");
}
else if (!inputObj.IsSet("body"))
{
throw new WxPayException("缺少统一支付接口必填参数body!");
}
else if (!inputObj.IsSet("total_fee"))
{
throw new WxPayException("缺少统一支付接口必填参数total_fee!");
}
else if (!inputObj.IsSet("trade_type"))
{
throw new WxPayException("缺少统一支付接口必填参数trade_type!");
}
//关联参数
if (inputObj.GetValue("trade_type").ToString() == "JSAPI" && !inputObj.IsSet("openid"))
{
throw new WxPayException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!");
}
if (inputObj.GetValue("trade_type").ToString() == "NATIVE" && !inputObj.IsSet("product_id"))
{
throw new WxPayException("统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!");
}