微信支付

此为原文转载!作者技术支持QQ:806693619

最近开发手机app需要实现移动支付功能,由于考虑支付安全将微信支付生成签名写到了服务器端,官网给的demo是在客户端的,纠结了几天终于实现了。

本教程不对微信支付申请,移动开发配置做解释。

开发思路:下载微信移动支付demo,根据demo的代码重新写服务器端,然后将生成的签名信息替换demo里面参数测试服务器端的代码是否成功,然后在写服务器端的返回成功处理程序。

废话不多说了直接上代码吧

1、C#生成支付签名代码
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/// <summary>
         /// 生成微信支付签名,生成结果直接在可以端提交即可
         /// </summary>
         /// <returns></returns>
         public  static  string  partnerid = "" ; //PartnerID
         public  static  string  partnerkey = "" ; //PartnerKey
         public  static  string  mchid = "" ; //mchid
         public  static  string  appId = "" ; //appid
         public  static  string  appsecret = "" ; //appsecret
         public  static  string  appkey = "" ; //paysignkey(非appkey 在微信商户平台设置 (md5)111111111111)
         public  static  string  timeStamp = "" ; //时间戳
         public  static  string  nonceStr = "" ; //随机字符串
         public  static  string  notify_url = "http://api.kwstu.com/Pay/WxNotifyUrl" ; //支付完成后的回调处理页面,*替换成notify_url.asp所在路径
         public  static  string  prepayId = "" ; //预支付ID
         public  static  string  sign = "" ;     //为了获取预支付ID的签名
         public  static  string  paySign = "" //进行支付需要的签名
         public  static  string  package = "" //进行支付需要的包
         public  HttpResponseMessage PostWxConfirmPay()
         {
                     //生成订单业务逻辑代码
 
 
 
 
 
 
                     //创建支付应答对象
                     var packageReqHandler = new  RequestHandler();
                     //初始化
                     packageReqHandler.init();
                     timeStamp = TenpayUtil.getTimestamp();
                     nonceStr = TenpayUtil.getNoncestr();
                     //设置package订单参数
                     packageReqHandler.setParameter( "appid" , appId);
                     packageReqHandler.setParameter( "body" , unitBase.NAME + "于"  + DateTime.Now.ToString( "yyyy-MM-dd" ) + "在线预订“"  + zphBase.ZPHNAME + "”的"  + zphZwService.ZWID + "号展位,缴费"  + price + "元。" ); //商品信息 127字符
                     packageReqHandler.setParameter( "mch_id" , mchid);
                     packageReqHandler.setParameter( "nonce_str" , nonceStr.ToLower());
                     packageReqHandler.setParameter( "notify_url" , notify_url);
                     packageReqHandler.setParameter( "out_trade_no" , checkId); //商家订单号
                     packageReqHandler.setParameter( "spbill_create_ip" , HttpContext.Current.Request.UserHostAddress); //用户的公网ip,不是商户服务器IPHttpContext.Current.Request.UserHostAddress
                     packageReqHandler.setParameter( "total_fee" , ( int .Parse(price)*100).ToString()); //商品金额,以分为单位(money * 100).ToString()
                     packageReqHandler.setParameter( "trade_type" , "APP" );
                     //获取package包
                     sign = packageReqHandler.CreateMd5Sign( "key" , appkey);
                     packageReqHandler.setParameter( "sign" , sign);
                     string  data = packageReqHandler.parseXML();
                     string  prepayXml = HttpUtil.Send(data, "https://api.mch.weixin.qq.com/pay/unifiedorder" );
                     //获取预支付ID
                     var xdoc = new  XmlDocument();
                     xdoc.LoadXml(prepayXml);
                     XmlNode xn = xdoc.SelectSingleNode( "xml" );
                     XmlNodeList xnl = xn.ChildNodes;
                     if  (xnl.Count > 7)
                     {
                         prepayId = xnl[7].InnerText;
                         package = string .Format( "prepay_id={0}" , prepayId);
                     }
                     //设置支付参数
                     var paySignReqHandler = new  RequestHandler();
                     paySignReqHandler.setParameter( "appid" , appId);
                     paySignReqHandler.setParameter( "noncestr" , nonceStr.ToLower());
                     paySignReqHandler.setParameter( "package" , "Sign=WXPay" );
                     paySignReqHandler.setParameter( "partnerid" , partnerid);
                     paySignReqHandler.setParameter( "prepayid" , prepayId);
                     paySignReqHandler.setParameter( "timestamp" , timeStamp);
                     paySign = paySignReqHandler.CreateMd5Sign( "key" , appkey);
                     var reList = new  List<WxPayListModel>();
                     var reModel = new  WxPayListModel();
                     reModel.appid = appId;
                     reModel.noncestr = nonceStr.ToLower();
                     reModel.package = "Sign=WXPay" ;
                     reModel.partnerid = partnerid;
                     reModel.prepayid = prepayId;
                     reModel.timestamp = timeStamp;
                     reModel.sign = paySign;
                     reList.Add(reModel);
 
         }

最终返回Json样例:

{"success":true,"msg":"操作成功","infor":[{"appid":"****","noncestr":"a532400ed62e772b9dc0b86f46e583ff","package":"Sign=WXPay","partnerid":"****","prepayid":"wx201511131946145c0b1467a10409581615","timestamp":"1447415119","sign":"3C2DC5263023BA69A268E353171DB0A0"}]}
替换客户端demo支付参数进行测试
?
1
2
3
4
5
6
7
8
9
10
11
private  void  sendPayReq() {
     msgApi.registerApp(Constants.APP_ID);
     req.appId = Constants.APP_ID;
     req.partnerId = Constants.MCH_ID;
     req.prepayId = "wx201511131946145c0b1467a10409581615" ;
     req.packageValue = "Sign=WXPay" ;
     req.nonceStr = "a532400ed62e772b9dc0b86f46e583ff" ;
     req.timeStamp = "1447415119" ;
     req.sign = "3C2DC5263023BA69A268E353171DB0A0" ;
     msgApi.sendReq(req);
}

 

服务端支付成功处理代码

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
ResponseHandler resHandler = new  ResponseHandler( null );
                 //if (!resHandler.IsTenpaySign())//验证签名
                 //{
                 //    LogUtil.WriteLog("sign error");
                 //    return;
                 //}
                 //resHandler.SetKey(PayConfig.AppKey);
                 ClassesLib.InsertLog( "微信支付成功1" );
                 #region 解析参数
                 //SUCCESS/FAIL此字段是通信标识,非交易标识,交易是否成功需要查
                 string  return_code = resHandler.GetParameter( "return_code" );
                 ClassesLib.InsertLog( "微信支付成功2"  + return_code);
                 //返回信息,如非空,为错误原因签名失败参数格式校验错误
                 string  return_msg = resHandler.GetParameter( "return_msg" );
                 ClassesLib.InsertLog( "微信支付成功3"  + return_msg);
                 if  (return_code.ToUpper() != "SUCCESS" )
                 {
                     //LogUtil.WriteLog("return_code faild:" + return_msg);
                     return  Content( "验证失败" );
                 }
                 #region 以下字段在 return_code 为 SUCCESS 的时候有返回
                 //业务结果 SUCCESS/FAIL
                 string  result_code = resHandler.GetParameter( "result_code" );
                 ClassesLib.InsertLog( "微信支付成功4"  + result_code);
                 //微信分配的公众账号 ID
                 string  appid = resHandler.GetParameter( "appid" );
                 ClassesLib.InsertLog( "微信支付成功5"  + appid);
                 //微信支付分配的商户号
                 string  mch_id = resHandler.GetParameter( "mch_id" );
                 ClassesLib.InsertLog( "微信支付成功6"  + mch_id);
                 //微信支付分配的终端设备号
                 string  device_info = resHandler.GetParameter( "device_info" );
                 ClassesLib.InsertLog( "微信支付成功7"  + device_info);
                 //随机字符串
                 string  nonce_str = resHandler.GetParameter( "nonce_str" );
                 ClassesLib.InsertLog( "微信支付成功8"  + nonce_str);
                 string  sign = resHandler.GetParameter( "sign" );
                 ClassesLib.InsertLog( "微信支付成功9"  + sign);
                 //错误代码
                 string  err_code = resHandler.GetParameter( "err_code" );
                 ClassesLib.InsertLog( "微信支付成功4"  + err_code);
                 //结果信息描述
                 string  err_code_des = resHandler.GetParameter( "err_code_des" );
                 ClassesLib.InsertLog( "微信支付成功10"  + err_code_des);
                 #endregion
                 if  (result_code.ToUpper() != "SUCCESS" )
                 {
                     //LogUtil.WriteLog("result_code faild:错误代码" + err_code + "结果信息描述" + err_code_des);
                     return  Content( "验证失败" );
                 }
                 #region 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回
                 //用户在商户 appid 下的唯一标识
                 string  openid = resHandler.GetParameter( "openid" );
                 ClassesLib.InsertLog( "微信支付成功11"  + openid);
                 //用户是否关注公众账号,Y-关注,N-未关注,仅在公众账号类型支付有效
                 string  is_subscribe = resHandler.GetParameter( "is_subscribe" );
                 ClassesLib.InsertLog( "微信支付成功12"  + is_subscribe);
                 //JSAPI、NATIVE、MICROPAY、APP
                 string  trade_type = resHandler.GetParameter( "trade_type" );
                 ClassesLib.InsertLog( "微信支付成功13"  + trade_type);
                 //银行类型,采用字符串类型的银行标识
                 string  bank_type = resHandler.GetParameter( "bank_type" );
                 ClassesLib.InsertLog( "微信支付成功14"  + bank_type);
                 //订单总金额,单位为分
                 string  total_fee = resHandler.GetParameter( "total_fee" );
                 ClassesLib.InsertLog( "微信支付成功15"  + total_fee);
                 //现金券金额
                 string  coupon_fee = resHandler.GetParameter( "coupon_fee" );
                 ClassesLib.InsertLog( "微信支付成功16"  + coupon_fee);
                 //货币类型,符合 ISO 4217 标准的三位字母代码,默认人民币:CNY
                 string  fee_type = resHandler.GetParameter( "fee_type" );
                 ClassesLib.InsertLog( "微信支付成功17"  + fee_type);
                 //微信支付订单号
                 string  transaction_id = resHandler.GetParameter( "transaction_id" );
                 ClassesLib.InsertLog( "微信支付成功18"  + transaction_id);
                 //商户系统的订单号,与请求一致。
                 string  out_trade_no = resHandler.GetParameter( "out_trade_no" );
                 ClassesLib.InsertLog( "微信支付成功19"  + out_trade_no);
                 //商家数据包,原样返回
                 string  attach = resHandler.GetParameter( "attach" );
                 ClassesLib.InsertLog( "微信支付成功20"  + attach);
                 //支 付 完 成 时 间 , 格 式 为yyyyMMddhhmmss,如 2009 年12 月27日 9点 10分 10 秒表示为 20091227091010。时区为 GMT+8 beijing。该时间取自微信支付服务器
                 string  time_end = resHandler.GetParameter( "time_end" );
                 ClassesLib.InsertLog( "微信支付成功21"  + time_end);
                 #endregion
                 #endregion
                 //LogUtil.WriteLog("4.total_fee= " + total_fee + "、err_code_des=" + err_code_des + "、result_code=" + result_code);
                 if  (!out_trade_no.Equals( "" ))
                 {
                     //LogUtil.WriteLog("5.success");
                     ClassesLib.InsertLog( "微信支付成功业务逻辑" );
                     Response.Write( "success" );
                     /**
                      *  这里输入用户逻辑操作,比如更新订单的支付状态
                      *
                      * **/
                     return  Content( "支付成功!" );
                 }
                 return  Content( "验证失败" );
             }
             catch  (Exception ex)
             {
                 //LogUtil.WriteLog("Notify 页面  发送异常错误:" + ex.Message);
                 return  Content( "支付失败" );
             }

相关资料获取地址:https://item.taobao.com/item.htm?spm=686.1000925.0.0.AlZkml&id=524281028471

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis 是一个基于 Java 的持久层框架,用于和数据库进行交互。微信支付是一种在线支付方式,允许用户通过微信进行支付。 为了在 MyBatis 中集成微信支付,可以按照以下步骤进行: 1. 添加微信支付 SDK:从微信支付官方网站下载并导入微信支付 SDK 到项目中。 2. 配置微信支付参数:在项目的配置文件中,添加微信支付所需的参数,如应用ID、商户ID、密钥等信息。这些参数可以通过注册微信支付商户账号获得。 3. 创建支付请求:在需要进行支付的业务逻辑中,调用微信支付 SDK 提供的接口创建支付请求。根据业务需求,可以设置支付金额、商品描述、订单号等参数。 4. 发起支付:调用微信支付 SDK 提供的接口发起支付请求。微信支付会返回一个支付链接,包含二维码或者跳转链接,用户可以用微信扫描二维码或者跳转到支付页面进行支付。 5. 处理支付结果:通过微信支付回调通知或者主动查询支付结果的方式,确认用户是否完成支付。根据支付结果,可以更新订单状态或者进行其他相关业务处理。 通过以上步骤,就可以在 MyBatis 中实现微信支付的集成。这样,用户就可以通过微信支付完成在线支付,提供了更加便捷和安全的支付方式。同时,MyBatis 的优势可以让开发者更加方便地操作数据库,持久化支付相关的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值