前言
目的是为APP提供微信支付功能,需要先在微信开发平台申请APP支付,微信工作人员审核资料无误后,会发送一封邮件给申请资料填写的邮箱,邮件包含开发时需要使用的支付账户信息。开发文档:统一下单https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
业务流程:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3
接入微信支付
解压下载文件:
在Visual Studio新建一个项目,新建一个文件夹,可以取名为WxAPI,按照解压后的business、lib里的类创建类,将内容复制到新文件里。
修复配置文件,打开WxPayConfig.cs文件,需要修改的内容如下:
//=======【基本信息设置】==========
/* 微信公众号信息配置
* APPID:绑定支付的APPID(必须配置)
* MCHID:商户号(必须配置)
* KEY:商户支付密钥,参考开户邮件设置(必须配置)
*/
public const string APPID = "wx3b64bba09b1bc4e8";
public const string KEY = "e10adc3849ba56abbe56e056f20f883e";
public const string APPSECRET = "51c56b886b5be869567dd389b3e5d1d6";
APPID和MCHID在发的邮件里都有,KEY需要在账号中心-账户设置-API安全-API密钥-设置密钥。
打开JsApiPay.cs文件,增加商品描述、订单号,只保留统一下单接口,并将测试数据修改掉,交易类型为APP,通知地址放到Web.config:
///
/// 商品描述
///
public string Body { get; set; }
///
/// 商户订单
///
public string OutTradeNo { get; set; }
/**
* 调用统一下单,获得下单结果
* @return 统一下单结果
* @失败时抛异常WxPayException
*/
public WxPayData GetUnifiedOrderResult()
{
//统一下单
WxPayData data = new WxPayData();
data.SetValue("body", Body);//商品描述
//data.SetValue("attach", "test");//附加数据
data.SetValue("out_trade_no", OutTradeNo);//商户订单号要求32个字符内
data.SetValue("total_fee", TotalFee);//总金额单位为分
data.SetValue("time_start", DateTime.Now.ToString("yyyyMMddHHmmss"));//交易起始时间
data.SetValue("time_expire", DateTime.Now.AddMinutes(10).ToString("yyyyMMddHHmmss"));//交易结束时间
//data.SetValue("goods_tag", "test");//订单优惠标记
data.SetValue("trade_type", "APP");//交易类型
data.SetValue("notify_url", ConfigurationManager.AppSettings["wx_notify_url"].ToString());//通知地址
WxPayData result = WxPayApi.UnifiedOrder(data);
if (!result.IsSet("appid") !result.IsSet("prepay_id") result.GetValue("prepay_id").ToString() == "")
{
Log.Error(this.GetType().ToString(), "UnifiedOrder response error!");
throw new WxPayException("UnifiedOrder response error!");
}
unifiedOrderResult = result;
return result;
}
完成统一下单接口调用,给APP生成支付订单。注意金额的单位为分,首先调用统计下单接口,返回的数据有:prepayid(微信生成的预支付会话标识,用于后续接口调用中使用,该值有效期为2小时),nonce_str(微信返回的随机字符串),微信有封装好的时间戳生成方法:WxPayApi.GenerateTimeStamp(),可以直接调用,将各个需要的参数SetValue后需要生成签名,调用MakeSign()生成签名后SetValue给sign,最后需要返回给APP的字段包含sign,timestamp,package。
核心代码:
//JSAPI支付预处理
try
{
WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult();
string timestamp = WxPayApi.GenerateTimeStamp();
WxPayData second = new WxPayData();
second.SetValue("timestamp", timestamp);
second.SetValue("package", "Sign=WXPay");
second.SetValue("appid", WxPayConfig.APPID);
second.SetValue("partnerid", WxPayConfig.MCHID);
second.SetValue("prepayid", unifiedOrderResult.GetValue("prepay_id"));
second.SetValue("noncestr", unifiedOrderResult.GetValue("nonce_str"));
second.SetValue("sign", second.MakeSign());
if (second.CheckSign())
{
unifiedOrderResult.SetValue("sign", second.GetValue("sign"));
unifiedOrderResult.SetValue("timestamp", timestamp);
unifiedOrderResult.SetValue("package", "Sign=WXPay");
return unifiedOrderResult.ToJson();
}
else
{
return "签名错误";
}
}
catch (Exception ex)
{
return "下单失败,请返回重试";
}
商户接收通知,处理完成支付的逻辑,新建页面,核心代码:
ResultNotify resultNotify = new ResultNotify(this);
resultNotify.ProcessNotify();
修改ResultNotify.cs文件,查询订单成功后加上支付完成处理逻辑即可。
【注意】
1. 调用统一下单接口后,需要再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay。
领取专属 10元无门槛券
私享最新 技术干货