C#微信开发之旅(十):APP预支付及支付参数生成(V2)

App支付流程:

本篇随笔只实现红框内的两个功能:生成预支付Id,生成app支付参数

 1        /// <summary>
 2         /// App 预支付
 3         /// </summary>
 4         /// <returns></returns>
 5         public ActionResult AppPrePay()
 6         {
 7             string orderNo = ""; //订单编号,文档中的out_trade_no
 8             string description = ""; //订单详情
 9             string totalFee = "";//订单金额(单位:分)
10             string notifyUrl = ""; //支付通知Url
11             string createIp = "";//用户IP
12
13             string traceId = string.Empty; //
14
15             WxPayModel model = WxPayModel.Create(description, orderNo, totalFee, notifyUrl, createIp);
16             //预支付
17             var result = WeiXinHelper.PreWXPay(model.CreateAppPrePayPackage(traceId));
18
19             if (!string.IsNullOrEmpty(result.PrePayId))
20             {
21                 Response.Write("预支付ID:" + result.PrePayId);
22             }
23             else
24             {
25                 Response.Write("预支付失败!");
26             }
27
28             //生成app支付json
29             string appPayJson = model.CreateAppPayPackage(result.PrePayId);
30
31             Response.Write("app支付Json:" + appPayJson);
32
33             return View();
34         }

下面是生成预支付json 和 app支付json的方法(均通过实际测试,可放心使用):

 1         /// <summary>
 2         /// 生成app预支付请求json(已测试通过)
 3         /// </summary>
 4         /// <param name="traceid">交易号:自定义,可用于订单的查询和跟踪,建议根据支付用户信息生成此Id</param>
 5         /// <returns></returns>
 6         /// <remarks>
 7         ///* { "appid":"wwwwb4f85f3a797777", "traceid":"crestxu",
 8         ///* "noncestr":"111112222233333", "package":
 9         ///* "bank_type=WX&body=XXX&fee_type=1&input_charset=GBK&notify_url=http%3a%2f%2f
10         ///* www
11         ///* .qq.com&out_trade_no=16642817866003386000&partner=1900000109&spbill_create_ip
12         ///* =127.0.0.1&total_fee=1&sign=BEEF37AD19575D92E191C1E4B1474CA9",
13         ///* "timestamp":1381405298,
14         ///* "app_signature":"53cca9d47b883bd4a5c85a9300df3da0cb48565c",
15         ///* "sign_method":"sha1" }
16         /// </remarks>
17         public string CreateAppPrePayPackage(string traceid)
18         {
19             Dictionary<string, string> nativeObj = new Dictionary<string, string>();
20             if (CheckCftParameters() == false)
21             {
22                 throw new SDKRuntimeException("生成package参数缺失!");
23             }
24             nativeObj.Add("appid", AppId);
25             nativeObj.Add("package", GetCftPackage());
26             nativeObj.Add("timestamp", ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000).ToString());
27             nativeObj.Add("traceid", traceid);
28             nativeObj.Add("noncestr", CommonUtil.CreateNoncestr());
29             nativeObj.Add("app_signature", GetBizSign(nativeObj));
30             nativeObj.Add("sign_method", SignType);
31
32             var entries = nativeObj.Select(d => string.Format("\"{0}\": \"{1}\"", d.Key, d.Value));
33
34             return "{" + string.Join(",", entries.ToArray()) + "}";
35         }
36
37         /// <summary>
38         /// 生成app支付请求json(已测试通过)
39         /// </summary>
40         /// <param name="prepayid">预支付id</param>
41         /// <returns></returns>
42         /// <remarks>
43         /// {
44         /// "appid":"wwwwb4f85f3a797777",
45         /// "noncestr":"111112222233333",
46         /// "package":"Sign=WXpay",
47         /// "partnerid":"1900000109",
48         /// "prepayid":"1101000000140429eb40476f4c9",
49         /// "sign":"53cca9d47b883bd4a5c85a9300df3da0cb48565c",
50         /// "timestamp":1381405298,
51         ///  }
52         /// </remarks>
53         public string CreateAppPayPackage(string prepayid)
54         {
55             Dictionary<string, string> nativeObj = new Dictionary<string, string>();
56             if (CheckCftParameters() == false)
57             {
58                 throw new SDKRuntimeException("生成package参数缺失!");
59             }
60             nativeObj.Add("appid", AppId);
61             nativeObj.Add("noncestr", CommonUtil.CreateNoncestr());
62             nativeObj.Add("package", "Sign=WXPay");
63             nativeObj.Add("partnerid", GetPartnerId());
64             nativeObj.Add("prepayid", prepayid);
65             nativeObj.Add("timestamp", ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000).ToString());
66             nativeObj.Add("sign", GetBizSign(nativeObj));
67
68             var entries = nativeObj.Select(d => string.Format("\"{0}\": \"{1}\"", d.Key, d.Value));
69
70             return "{" + string.Join(",", entries.ToArray()) + "}";
71         }
时间: 2024-12-29 11:13:19

C#微信开发之旅(十):APP预支付及支付参数生成(V2)的相关文章

C#微信开发之旅(十二):V2告警接口&amp;维权接口

告警接口,是微信用来通知我们一样警告信息,可以存储到DB定期查看并解决:维权则是用户主动发起的,需要我们处理.... 1 /// <summary> 2 /// 维权通知 3 /// </summary> 4 /// <returns></returns> 5 public void Notice() 6 { 7 #region 用户新增维权 8 9 /* 10 * <xml> 11 * <OpenId><![CDATA[o0p

C#微信开发之旅(三):AccessToken获取及全局管理

由于AccessToken有效期为2小时,并且接口调用有数量限制,所以开始时选择用WCF做了全局管理(项目中要到AccessToken的地方太多了,支付相关.生成二维码.获取用户信息.菜单操作等等) 下面是AccessToken全局管理的单例类,(原理:通过微信接口获取AccessToken,存储在内存中,当其他项目调用时,会判断是否过期,过期去拿新Token再返回): 1 /// <summary> 2 /// AccessToken类,公众号通过此token 获取相关信息 (单例类) 3

C#微信开发之旅(十三):V2订单查询&amp;退款(完结)

订单查询 用处同V3订单查询,直接上代码: 1 /// <summary> 2 /// V2订单查询 3 /// </summary> 4 public void QueryOrder() 5 { 6 string orderNo = string.Empty; 7 8 WxPayModel model = WxPayModel.Create(orderNo); 9 OrderQueryMessage message = WeiXinHelper.OrderQuery(model.

C#微信开发之旅(九):JSAPI支付(V3)(相关代码待补全)

微信开发遇到最复杂的就是支付了,无论V2还是V3.这篇文章将给出全套的V3版本JSAPI支付代码,包括预支付->支付->订单查询->通知->退款,其中前三步已经上线应用,退款只是简单测试了一下,大家要用的话需要谨慎... 一.预支付&支付 实际就是讲订单信息交给微信端,返回给我们一个预支付id(与V2app支付相似),支付时将预支付id交给微信处理.注意:预支付id 需存储,每个out_trade_no(我们自己的订单号)只能对应一个预支付id.代码奉上:(mvc demo

C#微信开发之旅(三):基础类之WeiXinConst

开发过程中需要用的的公众号信息在这里配置,此外需要用到的Url信息无需更改. /// <summary> /// 微信 需要用到的Url.Json常量 /// </summary> public class WeiXinConst { #region Value Const /// <summary> /// 微信开发者 AppId /// </summary> public const string AppId = "你的AppId";

OS开发之旅之App的生命周期【转载】

原文链接 http://www.360doc.com/content/15/0918/14/27799428_499912639.shtml 在iOS App中,入口函数并不在根目录下,而是在“Supporting Files”目录的main.m文件的main函数中.这很容易理解,C/C++都是以main为入口. int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, 

iOS开发之旅之App的生命周期

在iOS App中,入口函数并不在根目录下,而是在"Supporting Files"目录的main.m文件的main函数中.这很容易理解,C/C++都是以main为入口. int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } 这个函数比较简单,只是调用了UI

C#微信开发之旅(二):基础类之HttpClientHelper

包含通过HttpClient发起get或post请求的方法,所有调用微信接口的操作都通过此类.话不多说,直接上代码: 1 public class HttpClientHelper 2 { 3 /// <summary> 4 /// get请求 5 /// </summary> 6 /// <param name="url"></param> 7 /// <returns></returns> 8 public s

C#微信开发之旅(七):根据经纬度获取地址(百度地图Api)

开发过程中遇到这样的需求,根据用户的地理位置不同,显示不同区域的产品. 这里用到了微信:获取用户地理位置 的功能,(每隔5秒上报 或 进入回话时上报一次),我们根据微信推送过来的经纬度,来转换成实际地址,这里用到的是百度地图Api(要用的话先申请百度ak). PS:微信的这个功能很不稳定,靠它不靠谱,经常不推送...(后来加了手动定位,百度地图Web定位组件 还不错,不是广告!0.0) #region 根据经纬度 获取地址信息 BaiduApi /// <summary> /// 根据经纬度