微信小程序支付 小白版本 C#
微信小程序中用到在线支付功能,要在小程序里实现微信支付还是很方便的,下面我就具体说一下小程序里微信支付的开发流程和注意点。
1.首先看一下官方的文档,然后接着往下看。
1.1**简述官方文档**
查看小程序支付中的业务流程不难发现,整个支付过程简单而易于操作。
白话分析:想要完成支付,那么你需要做以下几件事。
1.小程序获取到使用人的openid。wx.login({})即可。(并不是直接返回openid,login获得code,进行处理后得到。)
2.统一下单,生成个订单,表明要发起支付了,产生订单。
3.订单产生,会返回给你一些必要的参数,具体参数可以查看官方文档。
4.回调,支付成功由微信端进行。(在下单API中已经加入了回调的URL)
下面简述开发流程
1.开通微信支付和微信商户号
这个过程就和开通服务号的微信支付过程一样,没有什么可以说的。
2.获取openid
需要在小程序的客户端js中获取当前用户的openid。
通过调用wx.login方法可以得到用户的code,然后开发者服务器使用登录凭证 code 获取 openid。
//以下是小程序js代码
wx.login({
success: function(res) {
if (res.code) {
wx.request({
url: '你的服务端地址',
method: 'POST',
data: {
code: res.code
},
success: function(res) {
//成功返回openid
var openid = res.data.openid;
},
fail: function(err) {
console.log(err)
}
})
} else {
console.log('获取用户登录态失败!' + res.errMsg)
}
}
});
//以下是服务端代码
//1.微信API返回openid
//SnsApi:引用进来。Appid:小程序的Appid。Secret:小程序的Secret
var jsonResult = SnsApi.JsCode2Json(Appid, Secret, request.Data);
//得到unionid
var unionid = jsonResult.unionid;
//得到openid
var openid = jsonResult.openid;
3.生成统一订单
直接上代码,参数有明确备注,但有些参数需要闹明白是什么
//创建键值对
var dic = new Dictionary<string, string>
{
{"appid", wx_appid}, //微信appid
{"body",wx_body}, //body 商品简单描述
{"mch_id", wx_mch_id}, //商户号 ●注意
{"nonce_str", nonce_str}, //随机字符串(20)
{"notify_url",notify_url},//异步通知的地址
{"openid",openid}, //openid wx.login({})返回的
{"out_trade_no","168168168"},//商户自己的订单号码
{"spbill_create_ip","192.168.1.168"},//IP地址
{"total_fee",1}, //支付多少钱
{"trade_type","JSAPI" }, //交易类型 JSAPI
};
//加入签名
dic.Add("sign", GetSignString(dic, wx_key)); //▲ 这个得说一下,key是商户的 Secret。(千万不要搞成小程序的)
var sb = new StringBuilder();
sb.Append("<xml>");
foreach (var d in dic)
{
sb.Append("<" + d.Key + ">" + d.Value + "</" + d.Key + ">");
}
sb.Append("</xml>");
var xml = new XmlDocument();
CookieCollection coo = new CookieCollection();
Encoding en = Encoding.GetEncoding("UTF-8");
//CreatePostHttpResponse();
//访问微信统一下单接口,将参数传递过去,生成订单。
HttpWebResponse response = CreatePostHttpResponse("https://api.mch.weixin.qq.com/pay/unifiedorder", sb.ToString(), en, wx_mch_id);
Stream stream = response.GetResponseStream();
StreamReader sr = new StreamReader(stream);
string html = sr.ReadToEnd();
xml.LoadXml(html);
DataSet ds = new DataSet();
StringReader stram = new StringReader(html);
XmlTextReader reader = new XmlTextReader(stram);
ds.ReadXml(reader);
string return_code = ds.Tables[0].Rows[0]["return_code"].ToString();
//返回信息。
if (return_code.ToUpper() == "SUCCESS")
{
string result_code = ds.Tables[0].Rows[0]["result_code"].ToString();
if (result_code.ToUpper() == "SUCCESS")
{
var res = new Dictionary<string, string> {
{"appId",wx_appid},
{"nonceStr",ds.Tables[0].Rows[0]["nonce_str"].ToString()},
{"package","prepay_id="+ds.Tables[0].Rows[0]["prepay_id"].ToString()},
{"signType","MD5"},
{"timeStamp",GetTimeStamp()},
};
res.Add("paySign", GetSignString(res, wx_key));
pay.timeStamp = res["timeStamp"];
pay.nonceStr = res["nonceStr"];
pay.package = res["package"];
pay.paySign = res["paySign"];
pay.wx_out_trade_no = wx_out_trade_no;
}
}
4.再次签名,发起支付
小程序提供的支付API,涉及参数都在统一下单的返回结果中。将这些参数进行拼装,在小程序中粘贴以下代码,发起支付。
wx.requestPayment(
{
'timeStamp': '',
'nonceStr': '',
'package': '',
'signType': 'MD5',
'paySign': '',
'success':function(res){
//成功。处理逻辑
//▲这也是坑之所在,很多人都认为这已经是支付完成后了。错了,当用户完成支付,进入微信自己的完成页面(非自己设计)用户不点击完成,是不触发该方法的。必须要注意,自己的业务逻辑写在这里是错误的。这就需要用到下一步的,回调(在统一下单时输入的回调URL)▲
},
'fail':function(res){},
'complete':function(res){}
})
5.支付成功后的回调
一般涉及到交易,金钱来往都是很重要的一环。最不可缺少的就是交易记录。如果只是等待用户去触发交易完成,后果可想而知。下面说一下成功后的回调。
在统一下单输入了回调的URL,在成功后,微信会回调你多次,一直到成功为止。
请参考自身业务进行编写代码。