wxpayapi

using System;

namespace EPayInterfaceApp
{
public class EPayInterfaceApp
{
/**
* 提交被扫支付API
* 收银员使用扫码设备读取微信用户刷卡授权码以后,二维码或条码信息传送至商户收银台,
* 由商户收银台或者商户后台调用该接口发起支付。
* @param WxPayData inputObj 提交给被扫支付API的参数
* @param int timeOut 超时时间
* @throws WxPayException
* @return 成功时返回调用结果,其他抛异常
*/
public static WxPayData Micropay(WxPayData inputObj)
{
int timeOut = 10;
string url = "https://api.mch.weixin.qq.com/pay/micropay";
//检测必填参数
if (!inputObj.IsSet("body"))
{
throw new WxPayException("提交被扫支付API接口中,缺少必填参数body!");
}
else if (!inputObj.IsSet("out_trade_no"))
{
throw new WxPayException("提交被扫支付API接口中,缺少必填参数out_trade_no!");
}
else if (!inputObj.IsSet("total_fee"))
{
throw new WxPayException("提交被扫支付API接口中,缺少必填参数total_fee!");
}
else if (!inputObj.IsSet("auth_code"))
{
throw new WxPayException("提交被扫支付API接口中,缺少必填参数auth_code!");
} inputObj.SetValue("spbill_create_ip", WxPayConfig.IP);//终端ip
inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID
inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号
inputObj.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", ""));//随机字符串
inputObj.SetValue("sign", inputObj.MakeSign());//签名
string xml = inputObj.ToXml(); DateTime start = DateTime.Now;//请求开始时间 Log.Debug("EPayInterfaceApp", "MicroPay request : " + xml);
string response = HttpService.Post(xml, url, false, timeOut);//调用HTTP通信接口以提交数据到API
Log.Debug("EPayInterfaceApp", "MicroPay response : " + response); DateTime end = DateTime.Now;
int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时 //将xml格式的结果转换为对象以返回
WxPayData result = new WxPayData();
result.FromXml(response); ReportCostTime(url, timeCost, result);//测速上报 return result;
} /**
*
* 查询订单
* @param WxPayData inputObj 提交给查询订单API的参数
* @param int timeOut 超时时间
* @throws WxPayException
* @return 成功时返回订单查询结果,其他抛异常
*/
public static WxPayData OrderQuery(WxPayData inputObj)
{
int timeOut = 6;
string url = "https://api.mch.weixin.qq.com/pay/orderquery";
//检测必填参数
if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
{
throw new WxPayException("订单查询接口中,out_trade_no、transaction_id至少填一个!");
} inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID
inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号
inputObj.SetValue("nonce_str", EPayInterfaceApp.GenerateNonceStr());//随机字符串
inputObj.SetValue("sign", inputObj.MakeSign());//签名 string xml = inputObj.ToXml(); DateTime start = DateTime.Now; Log.Debug("EPayInterfaceApp", "OrderQuery request : " + xml);
string response = HttpService.Post(xml, url, false, timeOut);//调用HTTP通信接口提交数据
Log.Debug("EPayInterfaceApp", "OrderQuery response : " + response); DateTime end = DateTime.Now;
int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时 //将xml格式的数据转化为对象以返回
WxPayData result = new WxPayData();
result.FromXml(response); ReportCostTime(url, timeCost, result);//测速上报 return result;
} /**
*
* 撤销订单API接口
* @param WxPayData inputObj 提交给撤销订单API接口的参数,out_trade_no和transaction_id必填一个
* @param int timeOut 接口超时时间
* @throws WxPayException
* @return 成功时返回API调用结果,其他抛异常
*/
public static WxPayData Reverse(WxPayData inputObj)
{
int timeOut = 6;
string url = "https://api.mch.weixin.qq.com/secapi/pay/reverse";
//检测必填参数
if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
{
throw new WxPayException("撤销订单API接口中,参数out_trade_no和transaction_id必须填写一个!");
} inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID
inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号
inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
inputObj.SetValue("sign", inputObj.MakeSign());//签名
string xml = inputObj.ToXml(); DateTime start = DateTime.Now;//请求开始时间 Log.Debug("EPayInterfaceApp", "Reverse request : " + xml); string response = HttpService.Post(xml, url, true, timeOut); Log.Debug("EPayInterfaceApp", "Reverse response : " + response); DateTime end = DateTime.Now;
int timeCost = (int)((end - start).TotalMilliseconds); WxPayData result = new WxPayData();
result.FromXml(response);
ReportCostTime(url, timeCost, result);//测速上报
return result;
} /**
*
* 申请退款
* @param WxPayData inputObj 提交给申请退款API的参数
* @param int timeOut 超时时间
* @throws WxPayException
* @return 成功时返回接口调用结果,其他抛异常
*/
public static WxPayData Refund(WxPayData inputObj)
{
int timeOut = 6;
string url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
//检测必填参数
if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
{
throw new WxPayException("退款申请接口中,out_trade_no、transaction_id至少填一个!");
}
else if (!inputObj.IsSet("out_refund_no"))
{
throw new WxPayException("退款申请接口中,缺少必填参数out_refund_no!");
}
else if (!inputObj.IsSet("total_fee"))
{
throw new WxPayException("退款申请接口中,缺少必填参数total_fee!");
}
else if (!inputObj.IsSet("refund_fee"))
{
throw new WxPayException("退款申请接口中,缺少必填参数refund_fee!");
}
else if (!inputObj.IsSet("op_user_id"))
{
throw new WxPayException("退款申请接口中,缺少必填参数op_user_id!");
}
inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID
inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号
inputObj.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", ""));//随机字符串
inputObj.SetValue("sign", inputObj.MakeSign());//签名
string xml = inputObj.ToXml();
DateTime start = DateTime.Now;
Log.Debug("EPayInterfaceApp", "Refund request : " + xml);
string response = HttpService.Post(xml, url, true, timeOut);//调用HTTP通信接口提交数据到API
Log.Debug("EPayInterfaceApp", "Refund response : " + response);
DateTime end = DateTime.Now;
int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时
//将xml格式的结果转换为对象以返回
WxPayData result = new WxPayData();
result.FromXml(response);
ReportCostTime(url, timeCost, result);//测速上报
return result;
} /**
*
* 查询退款
* 提交退款申请后,通过该接口查询退款状态。退款有一定延时,
* 用零钱支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态。
* out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个
* @param WxPayData inputObj 提交给查询退款API的参数
* @param int timeOut 接口超时时间
* @throws WxPayException
* @return 成功时返回,其他抛异常
*/
public static WxPayData RefundQuery(WxPayData inputObj)
{
int timeOut = 6;
string url = "https://api.mch.weixin.qq.com/pay/refundquery";
//检测必填参数
if(!inputObj.IsSet("out_refund_no") && !inputObj.IsSet("out_trade_no") &&
!inputObj.IsSet("transaction_id") && !inputObj.IsSet("refund_id"))
{
throw new WxPayException("退款查询接口中,out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个!");
}
inputObj.SetValue("appid",WxPayConfig.APPID);//公众账号ID
inputObj.SetValue("mch_id",WxPayConfig.MCHID);//商户号
inputObj.SetValue("nonce_str",GenerateNonceStr());//随机字符串
inputObj.SetValue("sign",inputObj.MakeSign());//签名
string xml = inputObj.ToXml();
DateTime start = DateTime.Now;//请求开始时间
Log.Debug("EPayInterfaceApp", "RefundQuery request : " + xml);
string response = HttpService.Post(xml, url, false, timeOut);//调用HTTP通信接口以提交数据到API
Log.Debug("EPayInterfaceApp", "RefundQuery response : " + response);
DateTime end = DateTime.Now;
int timeCost = (int)((end-start).TotalMilliseconds);//获得接口耗时
//将xml格式的结果转换为对象以返回
WxPayData result = new WxPayData();
result.FromXml(response);
ReportCostTime(url, timeCost, result);//测速上报
return result;
} /**
* 下载对账单
* @param WxPayData inputObj 提交给下载对账单API的参数
* @param int timeOut 接口超时时间
* @throws WxPayException
* @return 成功时返回,其他抛异常
*/
public static WxPayData DownloadBill(WxPayData inputObj)
{
int timeOut = 6;
string url = "https://api.mch.weixin.qq.com/pay/downloadbill";
//检测必填参数
if (!inputObj.IsSet("bill_date"))
{
throw new WxPayException("对账单接口中,缺少必填参数bill_date!");
} inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID
inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号
inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
inputObj.SetValue("sign", inputObj.MakeSign());//签名
string xml = inputObj.ToXml();
Log.Debug("EPayInterfaceApp", "DownloadBill request : " + xml);
string response = HttpService.Post(xml, url, false, timeOut);//调用HTTP通信接口以提交数据到API
Log.Debug("EPayInterfaceApp", "DownloadBill result : " + response);
WxPayData result = new WxPayData();
//若接口调用失败会返回xml格式的结果
if (response.Substring(0, 5) == "<xml>")
{
result.FromXml(response);
}
//接口调用成功则返回非xml格式的数据
else
result.SetValue("result", response);
return result;
} /**
*
* 转换短链接
* 该接口主要用于扫码原生支付模式一中的二维码链接转成短链接(weixin://wxpay/s/XXXXXX),
* 减小二维码数据量,提升扫描速度和精确度。
* @param WxPayData inputObj 提交给转换短连接API的参数
* @param int timeOut 接口超时时间
* @throws WxPayException
* @return 成功时返回,其他抛异常
*/
public static WxPayData ShortUrl(WxPayData inputObj)
{
int timeOut = 6;
string url = "https://api.mch.weixin.qq.com/tools/shorturl";
//检测必填参数
if(!inputObj.IsSet("long_url"))
{
throw new WxPayException("需要转换的URL,签名用原串,传输需URL encode!");
} inputObj.SetValue("appid",WxPayConfig.APPID);//公众账号ID
inputObj.SetValue("mch_id",WxPayConfig.MCHID);//商户号
inputObj.SetValue("nonce_str",GenerateNonceStr());//随机字符串
inputObj.SetValue("sign",inputObj.MakeSign());//签名
string xml = inputObj.ToXml();
DateTime start = DateTime.Now;//请求开始时间
Log.Debug("EPayInterfaceApp", "ShortUrl request : " + xml);
string response = HttpService.Post(xml, url, false, timeOut);
Log.Debug("EPayInterfaceApp", "ShortUrl response : " + response);
DateTime end = DateTime.Now;
int timeCost = (int)((end - start).TotalMilliseconds);
WxPayData result = new WxPayData();
result.FromXml(response);
ReportCostTime(url, timeCost, result);//测速上报
return result;
} /**
*
* 统一下单
* @param WxPaydata inputObj 提交给统一下单API的参数
* @param int timeOut 超时时间
* @throws WxPayException
* @return 成功时返回,其他抛异常
*/
public static WxPayData UnifiedOrder(WxPayData inputObj)
{
int timeOut = 6;
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为必填参数!");
} //异步通知url未设置,则使用配置文件中的url
if (!inputObj.IsSet("notify_url"))
{
inputObj.SetValue("notify_url", WxPayConfig.NOTIFY_URL);//异步通知url
}
inputObj.SetValue("appid", WxPayConfig.APPID);//公众账号ID
inputObj.SetValue("mch_id", WxPayConfig.MCHID);//商户号
inputObj.SetValue("spbill_create_ip", WxPayConfig.IP);//终端ip
inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
//签名
inputObj.SetValue("sign", inputObj.MakeSign());
string xml = inputObj.ToXml();
DateTime start = DateTime.Now;
Log.Debug("EPayInterfaceApp", "UnfiedOrder request : " + xml);
string response = HttpService.Post(xml, url, false, timeOut);
Log.Debug("EPayInterfaceApp", "UnfiedOrder response : " + response);
DateTime end = DateTime.Now;
int timeCost = (int)((end - start).TotalMilliseconds);
WxPayData result = new WxPayData();
result.FromXml(response);
ReportCostTime(url, timeCost, result);//测速上报
return result;
} /**
*
* 关闭订单
* @param WxPayData inputObj 提交给关闭订单API的参数
* @param int timeOut 接口超时时间
* @throws WxPayException
* @return 成功时返回,其他抛异常
*/
public static WxPayData CloseOrder(WxPayData inputObj)
{
int timeOut = 6;
string url = "https://api.mch.weixin.qq.com/pay/closeorder";
//检测必填参数
if(!inputObj.IsSet("out_trade_no"))
{
throw new WxPayException("关闭订单接口中,out_trade_no必填!");
}
inputObj.SetValue("appid",WxPayConfig.APPID);//公众账号ID
inputObj.SetValue("mch_id",WxPayConfig.MCHID);//商户号
inputObj.SetValue("nonce_str",GenerateNonceStr());//随机字符串
inputObj.SetValue("sign",inputObj.MakeSign());//签名
string xml = inputObj.ToXml();
DateTime start = DateTime.Now;//请求开始时间
string response = HttpService.Post(xml, url, false, timeOut);
DateTime end = DateTime.Now;
int timeCost = (int)((end - start).TotalMilliseconds);
WxPayData result = new WxPayData();
result.FromXml(response);
ReportCostTime(url, timeCost, result);//测速上报
return result;
} /**
*
* 测速上报
* @param string interface_url 接口URL
* @param int timeCost 接口耗时
* @param WxPayData inputObj参数数组
*/
private static void ReportCostTime(string interface_url, int timeCost, WxPayData inputObj)
{
//如果仅失败上报
if(WxPayConfig.REPORT_LEVENL == 1 && inputObj.IsSet("return_code") && inputObj.GetValue("return_code").ToString() == "SUCCESS" &&
inputObj.IsSet("result_code") && inputObj.GetValue("result_code").ToString() == "SUCCESS")
{
return;
} //上报逻辑
WxPayData data = new WxPayData();
data.SetValue("interface_url",interface_url);
data.SetValue("execute_time_",timeCost);
//返回状态码
if(inputObj.IsSet("return_code"))
{
data.SetValue("return_code",inputObj.GetValue("return_code"));
}
//返回信息
if(inputObj.IsSet("return_msg"))
{
data.SetValue("return_msg",inputObj.GetValue("return_msg"));
}
//业务结果
if(inputObj.IsSet("result_code"))
{
data.SetValue("result_code",inputObj.GetValue("result_code"));
}
//错误代码
if(inputObj.IsSet("err_code"))
{
data.SetValue("err_code",inputObj.GetValue("err_code"));
}
//错误代码描述
if(inputObj.IsSet("err_code_des"))
{
data.SetValue("err_code_des",inputObj.GetValue("err_code_des"));
}
//商户订单号
if(inputObj.IsSet("out_trade_no"))
{
data.SetValue("out_trade_no",inputObj.GetValue("out_trade_no"));
}
//设备号
if(inputObj.IsSet("device_info"))
{
data.SetValue("device_info",inputObj.GetValue("device_info"));
} try
{
Report(data);
}
catch (WxPayException ex)
{
//不做任何处理
}
} /**
*
* 测速上报接口实现
* @param WxPayData inputObj 提交给测速上报接口的参数
* @param int timeOut 测速上报接口超时时间
* @throws WxPayException
* @return 成功时返回测速上报接口返回的结果,其他抛异常
*/
public static WxPayData Report(WxPayData inputObj)
{
int timeOut = 1;
string url = "https://api.mch.weixin.qq.com/payitil/report";
//检测必填参数
if(!inputObj.IsSet("interface_url"))
{
throw new WxPayException("接口URL,缺少必填参数interface_url!");
}
if(!inputObj.IsSet("return_code"))
{
throw new WxPayException("返回状态码,缺少必填参数return_code!");
}
if(!inputObj.IsSet("result_code"))
{
throw new WxPayException("业务结果,缺少必填参数result_code!");
}
if(!inputObj.IsSet("user_ip"))
{
throw new WxPayException("访问接口IP,缺少必填参数user_ip!");
}
if(!inputObj.IsSet("execute_time_"))
{
throw new WxPayException("接口耗时,缺少必填参数execute_time_!");
} inputObj.SetValue("appid",WxPayConfig.APPID);//公众账号ID
inputObj.SetValue("mch_id",WxPayConfig.MCHID);//商户号
inputObj.SetValue("user_ip",WxPayConfig.IP);//终端ip
inputObj.SetValue("time",DateTime.Now.ToString("yyyyMMddHHmmss"));//商户上报时间
inputObj.SetValue("nonce_str",GenerateNonceStr());//随机字符串
inputObj.SetValue("sign",inputObj.MakeSign());//签名
string xml = inputObj.ToXml(); Log.Info("EPayInterfaceApp", "Report request : " + xml); string response = HttpService.Post(xml, url, false, timeOut); Log.Info("EPayInterfaceApp", "Report response : " + response); WxPayData result = new WxPayData();
result.FromXml(response);
return result;
} /**
* 根据当前系统时间加随机序列来生成订单号
* @return 订单号
*/
public static string GenerateOutTradeNo()
{
Random ran = new Random();
return string.Format("{0}{1}{2}", WxPayConfig.MCHID, DateTime.Now.ToString("yyyyMMddHHmmss"), ran.Next(999));
} /**
* 生成时间戳,标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数
* @return 时间戳
*/
public static string GenerateTimeStamp()
{
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
} /**
* 生成随机串,随机串包含字母或数字
* @return 随机串
*/
public static string GenerateNonceStr()
{
return Guid.NewGuid().ToString().Replace("-", "");
}
}
}

  Alipayapi

#region 支付宝接口
/*
{"alipay_trade_pay_response":{"code":"40004","msg":"Business Failed","sub_code":"ACQ.SELLER_NOT_EXIST",
"sub_msg":"支付失败,本商户账号异常,请联系管理员处理,建议顾客使用其他方式付款。[SELLER_NOT_EXIST]",
"buyer_pay_amount":"0.00","invoice_amount":"0.00",
"out_trade_no":"735a3265eed6b609",
"point_amount":"0.00","receipt_amount":"0.00"},
"sign":"ArSRYRy6SlLLPQWSRHI596b9h/cv+AKK92oWCB3H4bwPzLr9LZ78j5kUVVzvdd2nME1V8h5M2P0SRoy/kujGB/V8N9oJCgaaX856xgZIevkNhXpILMdxaNTc3qgcoPzAduZ+aKx2sktrwA2KbtbdK2jjE8eeDqTcEgng2hwKEbA="} {"alipay_trade_pay_response":{"code":"10000","msg":"Success",
"buyer_logon_id":"710***@qq.com","buyer_pay_amount":"0.01","buyer_user_id":"2088002008293033",
"fund_bill_list":[{"amount":"0.01","fund_channel":"ALIPAYACCOUNT"}],
"gmt_payment":"2016-09-29 10:51:03","invoice_amount":"0.01",
"open_id":"20881068707802584019802220315503",
"out_trade_no":"5e2a9a41f89ec6d9",
"point_amount":"0.00","receipt_amount":"0.01",
"total_amount":"0.01","trade_no":"2016092921001004030263332463"},
"sign":"j2SLzhk+CfUuSj5nW3fnumiEgy3HJhKVyWzGfmFJVp6HkkhcVNjhbKod6jDbE2hBOpvfT7bC1nPUFQty+gIyc2A7IAc6R8uEXEVVTeTM9DnUuU+gC+w+QOOu8O7i443zIl8Pm+G0a9NX5bdyJRDGLNiTKbFXcHrJYKE2sJHQL7o="}
*/
/// <summary>
/// 发起付款请求
/// </summary>
/// <param name="barcode"></param>
private void execAliPayAction(string barcode)
{
string payResultJson = string.Empty;
AlipayTradePayContentBuilder builder = BuildPayContent(barcode);
string out_trade_no = builder.out_trade_no;
AlipayF2FPayResult payResult = serviceClient.tradePay(builder);
switch (payResult.Status)
{
case ResultEnum.SUCCESS:
payResultJson = DoSuccessProcess(payResult);
break;
case ResultEnum.FAILED:
payResultJson = DoFailedProcess(payResult);
break;
case ResultEnum.UNKNOWN:
payResultJson = @"{""code"":""-99"",""msg"":""网络异常,请检查网络配置后,更换外部订单号重试""}";
break;
}
JsonData resultJsonData = JsonMapper.ToObject(payResultJson);
JsonData resultJson = resultJsonData["alipay_trade_pay_response"];
string code = (string)resultJson["code"];
string msg = (string)resultJson["msg"];
if (code == "10000" && msg == "Success")
{
iniHelper.IniWriteValue("interfaceResult", "code", "0");
iniHelper.IniWriteValue("interfaceResult", "message", "操作成功!");
iniHelper.IniWriteValue("interfaceResult", "order_no", (string)resultJson["out_trade_no"]);
iniHelper.IniWriteValue("interfaceResult", "open_id", (string)resultJson["open_id"]);
iniHelper.IniWriteValue("interfaceResult", "transact_id", (string)resultJson["trade_no"]);
iniHelper.IniWriteValue("interfaceResult", "buyer_info", (string)resultJson["buyer_user_id"]+","+ (string)resultJson["buyer_logon_id"]);
if (Program.erpHandle != IntPtr.Zero)
Utility.SendMessage(Program.erpHandle, (uint)Program.NOTIFY_MESSAGE, 0, 0);
isRuning = false;
Application.ExitThread();
Application.Exit();
}
else
{
iniHelper.IniWriteValue("interfaceResult", "code", "-"+ (string)resultJson["code"]);
iniHelper.IniWriteValue("interfaceResult", "message", (string)resultJson["sub_msg"]);
iniHelper.IniWriteValue("interfaceResult", "order_no", (string)resultJson["out_trade_no"]);
if (Program.erpHandle != IntPtr.Zero)
Utility.SendMessage(Program.erpHandle, (uint)Program.NOTIFY_MESSAGE, 0, 0);
isRuning = false;
Application.ExitThread();
Application.Exit();
}
}
private AlipayTradePayContentBuilder BuildPayContent(string barcode)
{
//线上联调时,请输入真实的外部订单号。
string out_trade_no = GuidTo16String();
//扫码枪扫描到的用户手机钱包中的付款条码
AlipayTradePayContentBuilder builder = new AlipayTradePayContentBuilder();
builder.out_trade_no = out_trade_no;
builder.scene = "bar_code";
builder.auth_code = barcode;
builder.total_amount = paymentRow.ItemDataRow[2].ToString();
builder.discountable_amount = paymentRow.ItemDataRow[2].ToString();
builder.undiscountable_amount = "0";
builder.operator_id = "alipay_mayun";
builder.subject = string.Format("{0}消费", StoreName);
builder.timeout_express = "2m";
builder.body = "订单描述";
builder.store_id = string.Format("{0}消费", StoreName); //很重要的参数,可以用作之后的营销
builder.seller_id = Config.pid; //可以是具体的收款账号。
//传入商品信息详情
List<GoodsInfo> gList = new List<GoodsInfo>();
GoodsInfo goods = new GoodsInfo();
goods.goods_id = "goods id";
goods.goods_name = builder.subject;
goods.price = builder.total_amount;
goods.quantity = "1";
gList.Add(goods);
builder.goods_detail = gList;
//扩展参数
//系统商接入可以填此参数用作返佣
//ExtendParams exParam = new ExtendParams();
//exParam.sysServiceProviderId = Config.pid;
//builder.extendParams = exParam;
return builder; }
/// <summary>
/// 顾客主动扫描二维码构建
/// </summary>
/// <returns></returns>
private AlipayTradePrecreateContentBuilder BuildPrecreateContent()
{
//线上联调时,请输入真实的外部订单号。
string out_trade_no = GuidTo16String();
AlipayTradePrecreateContentBuilder builder = new AlipayTradePrecreateContentBuilder();
builder.out_trade_no = out_trade_no;
builder.total_amount = paymentRow.ItemDataRow[2].ToString();
builder.undiscountable_amount = "0";
builder.operator_id = "alipay_mayun";
builder.subject = "扫码支付";
builder.time_expire = System.DateTime.Now.AddHours(1).ToString("yyyy-MM-dd HH:mm:ss"); ;
builder.body = "订单描述";
builder.store_id = string.Format("{0}消费", StoreName); //很重要的参数,可以用作之后的营销
builder.seller_id = Config.pid; //可以是具体的收款账号。
//传入商品信息详情
List<GoodsInfo> gList = new List<GoodsInfo>();
GoodsInfo goods = new GoodsInfo();
goods.goods_id = "goods id";
goods.goods_name = "goods name";
goods.price = builder.total_amount;
goods.quantity = "1";
gList.Add(goods);
builder.goods_detail = gList;
//扩展参数
//系统商接入可以填此参数用作返佣
//ExtendParams exParam = new ExtendParams();
//exParam.sysServiceProviderId = "20880000000000";
//builder.extendParams = exParam;
return builder;
} /// <summary>
/// 请添加支付成功后的处理
/// </summary>
private string DoSuccessProcess(AlipayF2FPayResult payResult)
{
Com.DataCool.DotNetExpand.LogHelper.Info("支付成功");
result = payResult.response.Body;
return result;
} private string DoFailedProcess(AlipayF2FPayResult payResult)
{
//请添加支付失败后的处理
Com.DataCool.DotNetExpand.LogHelper.Error("支付失败");
result = payResult.response.Body;
return result;
} /// <summary>
/// 根据GUID获取16位的唯一字符串
/// </summary>
/// <param name=\"guid\"></param>
/// <returns></returns>
public static string GuidTo16String()
{
long i = 1;
foreach (byte b in Guid.NewGuid().ToByteArray())
i *= ((int)b + 1); return string.Format("{0:x}", i - DateTime.Now.Ticks);
} /// <summary>
///退款请求消息报文构建
/// </summary>
/// <param name="trade_no"></param>
/// <param name="request_no"></param>
/// <returns></returns>
private AlipayTradeRefundContentBuilder BuildContent(string trade_no, string request_no)
{
AlipayTradeRefundContentBuilder builder = new AlipayTradeRefundContentBuilder();
//商户订单号
builder.out_trade_no = trade_no;
//交易号——退款请求单号保持唯一性。
builder.out_request_no = request_no;
//退款金额
builder.refund_amount = paymentRow.ItemDataRow[2].ToString();
builder.refund_reason = "销售退货";
return builder;
} #endregion

  

C#wxpay和alipay的更多相关文章

  1. 使用hexo+coding搭建免费个人博客

    1.检测node和npm 先检测一下有没有node.js和npm $ node -v //如果有,说明node.js安装成功! $ node -v v8.4.0 //如果有,说明npm安装成功! $n ...

  2. NopCommerce Alipay 支付插件

    NopCommerce Alipay 支付插件 1.查找及下载NopCommerce Alipay插件 http://www.nopcommerce.com/p/963/alipay-payment- ...

  3. iOS - AliPay 支付宝支付

    1.支付宝支付申请 支付宝支付官方签约集成指引 支付宝APP支付官方集成指引 蚂蚁金服开放平台 1.1 支付宝 APP 支付申请步骤 APP 支付:APP 支付是商户通过在移动端应用 APP 中集成开 ...

  4. iOS - WXPay 微信支付

    1.微信支付申请 微信支付官方集成指引 微信支付官方集成指导视频 微信 APP 支付开发者文档 微信公众平台 微信开放平台 微信商户平台 1.1 微信 APP 支付申请步骤 APP 支付:APP 支付 ...

  5. 【转载】关于Alipay支付宝接口(Java版)

    转载自:http://blog.163.com/lai_chao/blog/static/70340789201412724619514/ 1.alipay 双功能支付简介 2.alipay 提交支付 ...

  6. 嵌入支付宝SDK,出现“LaunchServices: ERROR: There is no registered handler for URL scheme alipay”错误

    应用项目中嵌入支付宝SDK,在模拟器运行app后,会出现“LaunchServices: ERROR: There is no registered handler for URL scheme al ...

  7. ecshop /includes/modules/payment/alipay.php SQL Injection Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 ECSHOP支付插件存在SQL注入漏洞,此漏洞存在于/includes/ ...

  8. alipay iOS SDK

    我也是醉了,进支付宝主页找都找不到,好不容易找到赶紧记下来:https://b.alipay.com/order/productDetail.htm?productId=201308060460965 ...

  9. 集成 AliPay - 支付宝

    作者感言 前面我已经写了一篇关于WeChat SDK的支付篇, 那我们继续研究接下来的支付SDK, 这次就是国民支付软件支付宝, 下面就让我们来看看怎么集成AliPay SDK.最后:如果你有更好的建 ...

随机推荐

  1. C++ map multimap

    map multimap map,multimap key-value对容器,也叫字典,map中不能存放key相同的元素,而multimap可以,容器中元素默认按升序排序 map multimap的相 ...

  2. C++ stack

    stack 栈,一种后进先出的数据结构,在c++ stl里作为容器适配器,string,vector,deque,在内存中是连续的 声明方式 stack<int,deque<T>&g ...

  3. Spring Cloud 自定义ConfigServer

    公司需要将系统配置信息中的敏感信息独立存放. 现有系统采用Spring Cloud Config提供配置信息,其中敏感信息主要是Db配置,分解本次需求: (1)数据库配置信息分离(主要是Db信息). ...

  4. springMVC(1)---获取前段数据

    springMVC(1)---获取前段数据 首先说明,如果你学过Struts2,那么在学springMVC就会简单很多,我也不最基础的开始写了,我前篇文章搭建了个ssm框架,算是springmvc入门 ...

  5. java微信开发API解析(二)-获取消息和回复消息

    java微信开发API解析(二)-获取消息和回复消息 说明 * 本演示样例依据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/20 ...

  6. UVA 12009 - Avaricious Maryanna(数论)

    UVA 12009 - Avaricious Maryanna 题目链接 题意:给定一个n.求出n个数位组成的数字x,x^2的前面|x|位为x 思路:自己先暴力打了前几组数据,发现除了1中有0和1以外 ...

  7. BZOJ 1211 HNOI2004 树的计数 Prufer序列

    题目大意:给定一棵树中全部点的度数,求有多少种可能的树 Prufer序列.详细參考[HNOI2008]明明的烦恼 直接乘会爆long long,所以先把每一个数分解质因数.把质因数的次数相加相减.然后 ...

  8. 沉迷 Docker,无法自拔(在 Docker 中运行 MySQL)

    记得之前做网站开发的时候,因为服务端用的 MySQL 数据库,为了方便调试以及隔离生产与开发环境,自己就在本地也安装了一个 MySQL 数据库.但是用着用着慢慢的也发现了一些不舒服的地方,比如常驻后台 ...

  9. 解决 ASP.NET Core MySql varchar 字符串截取(长度 255)

    ASP.NET Core 中使用 MySql,如果字段类型为varchar,不管设置多少长度,插入或更新数据的时候,会自动截断(截取 255 长度的字符). 出现问题的原因,就是使用了MySql.Da ...

  10. 十、 Spring Boot Shiro 权限管理

    使用Shiro之前用在spring MVC中,是通过XML文件进行配置. 将Shiro应用到Spring Boot中,本地已经完成了SpringBoot使用Shiro的实例,将配置方法共享一下. 先简 ...