1:微信支付分很多种方式 如下图。这里单独讲解一下H5的支付,也就是微信公众号里面的支付方式
https://pay.weixin.qq.com/wiki/doc/api/index.html
2:在支付时一般会有一个选择支付方式页面。如下图,下订单成功后,跳转到选择支付方式页面。当如还要加一个微信支付功能
3:如果选择微信支付,这里会需要再自定义一个页面,显示具体的支付详细。一般需要有
支付金额 支付订单号 以及支付备注信息
点击支付按钮 这里才是真正的支付功能
4:支付方式 。这里需要使用监听微信支付
5:上面还没有真正的调用微信支付功能,在调用 onBridgeReady 方法时才调用微信支付
onBridgeReady里面是具体的微信支付代码。在调用微信支付的时候需要用到一些参数,签名,时间戳 所以这些可以在服务端去获取一下。例如: 这里面先是调用 pi.WepayReady 方法,这个方法是获取签名 ,以及商户号 ,签名方式等等
onBridgeReady() {
var param = new this.URLSearchParam();
param.append('parentNo', this.parentNo);
param.append('code', this.code);
param.append('type', this.orderType);
param.append('i998', true);
var that = this;
that.shelter(false);
this.$http.post(api.WepayReady(), param.toParam()).then((res) => {
that.shelter(true);
if (!res.Result) {
window.alert(res.Message);
return;
}
WeixinJSBridge.invoke('getBrandWCPayRequest', {
"appId": res.Data.appId, //公众号名称,由商户传入
"timeStamp": res.Data.timeStamp, //时间戳,自1970年以来的秒数
"nonceStr": res.Data.nonceStr, //随机串
"package": res.Data.package,
"signType": "MD5", //微信签名方式:
"paySign": res.Data.paySign //微信签名
}, function(res) {
if (res.err_msg == "get_brand_wcpay_request:ok") {
if (that.orderType == 0) {
//window.location.href="https://i.998.com/home/order?t="+Math.random();
that.$router.push({ path: '/home/order' });
} else if (that.orderType == 1) {
//window.location.href="https://i.998.com/home/wallet?t="+Math.random();
that.$router.push({ path: '/wallet/valueCardDetail' });
} else if (that.orderType == 2) {
that.$router.push({ path: '/user/Breakfast' });
} else {
//window.location.href="https://i.998.com/home/index?t="+Math.random();
that.$router.push({ path: '/home/index' });
}
} else if (res.err_msg == "get_brand_wcpay_request:cancel") {
window.alert("交易取消");
} else {
window.alert("交易失败");
}
if (that.orderType == 0) {
that.$router.push({ path: '/home/order' });
} else if (that.orderType == 1) {
that.$router.push({ path: '/wallet/valueCardDetail' });
} else if (that.orderType == 2) {
that.$router.push({ path: '/user/Breakfast' });
} else {
that.$router.push({ path: '/home/index' });
}
})}); },
6:WepayReady是服务端方法,主要用于返回获取签名 ,以及商户号 ,签名方式等等
这里只是显示 控制器接口,里面会有详细代码,主要方式就是获取签名信息
7:调用WeixinJSBridge.invoke('getBrandWCPayRequest', 这个方法,返回值为:
if (res.err_msg == "get_brand_wcpay_request:ok") { 支付成功 }
else if (res.err_msg == "get_brand_wcpay_request:cancel") {
window.alert("交易取消");
} else {
window.alert("交易失败");
}
8:在传的参数 package里面需要注意,是一个xml 。里面有支付回调方法
例如: String prepay_id = WepayUtil.GetPrepayId(order, paySignKey);
GetPrepayId方法具体代码如下:
9:GetUnifiedOrderXml方法的明细
public static string GetUnifiedOrderXml(UnifiedOrder order, string key)
{
string return_string = string.Empty;
SortedDictionary<string, string> sParams = new SortedDictionary<string, string>();
sParams.Add("appid", order.appid); /// 公共号ID(微信分配的公众账号 ID)
sParams.Add("attach", order.attach); // 附加数据,原样返回
sParams.Add("body", order.body); // 商品描述
sParams.Add("device_info", order.device_info); // 微信支付分配的终端设备号
sParams.Add("mch_id", order.mch_id); // 商户号(微信支付分配的商户号)
sParams.Add("nonce_str", order.nonce_str); // 随机字符串,不长于 32 位
sParams.Add("notify_url", order.notify_url); // 接收微信支付成功通知
sParams.Add("openid", order.openid); /// 用户标识 trade_type 为 JSAPI时,此参数必传
sParams.Add("out_trade_no", order.out_trade_no);// 商户系统内部的订单号,32个字符内、可包含字母,确保在商户系统唯一,详细说明
sParams.Add("spbill_create_ip", order.spbill_create_ip);// 终端IP
sParams.Add("total_fee", order.total_fee.ToString()); // 订单总金额,单位为分,不能带小数点
sParams.Add("trade_type", order.trade_type);// JSAPI、NATIVE、APP
order.sign = GetSign(sParams, key);
sParams.Add("sign", order.sign);
//拼接成XML请求数据
StringBuilder sbPay = new StringBuilder();
foreach (KeyValuePair<string, string> k in sParams)
{
if (k.Key == "attach" || k.Key == "body" || k.Key == "sign")
{
if (k.Key == "body")
{
byte[] byteArray = Encoding.UTF8.GetBytes(k.Value);
string tempString = Encoding.UTF8.GetString(byteArray);
sbPay.Append("<" + k.Key + "><![CDATA[" + tempString + "]]></" + k.Key + ">");
}
else
{
sbPay.Append("<" + k.Key + "><![CDATA[" + k.Value + "]]></" + k.Key + ">");
}
}
else
{
sbPay.Append("<" + k.Key + ">" + k.Value + "</" + k.Key + ">");
}
}
return_string = string.Format("<xml>{0}</xml>", sbPay.ToString());
//byte[] byteArray = Encoding.UTF8.GetBytes(return_string);
//return_string = Encoding.UTF8.GetString(byteArray);
return return_string;
}