服务器端接入微信支付

前言

目的是为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。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180124G0I8ZO00?refer=cp_1026

扫码关注云+社区