步骤2:用户利用微信“扫一扫”(如图6.2)扫描二维码后,获取商品支付信息,勾引用户完成支付(如图6.3)。
步骤3:用户确认支付,输入支付密码(如图6.4)。
步骤4:支付完成后会提示用户支付成功(如图6.5),商户后台得到支付成功的关照,然后进行发货处理。
查看是否安装成功:
笔者在实际项目中要利用微信扫码付款功能,开拓的时候选择的是微信扫码支付的模式一(https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_4)
代码片段
/// <summary> /// 威富通-微信支付 /// </summary> /// <param name=\"大众total_fee\公众>订单金额</param> /// <param name=\"大众orderno\"大众>订单号</param> /// <param name=\"大众productName\公众>产品名称</param> private void WebChat(decimal total_fee, string orderno, string productName) { try { total_fee = total_fee 100;//单位:分 PayReqEntity entity = new PayReqEntity(); entity.mch_id =“商户ID” string key =“KEY\公众;//您申请的 entity.key = key; entity.req_url = \"大众https://pay.swiftpass.cn/pay/gateway\"大众; entity.service = \"大众pay.weixin.native\"大众; entity.version = \"大众2.0\"大众; entity.out_trade_no = orderno; entity.body = productName; entity.attach = \公众\公众; entity.total_fee = Math.Round(total_fee).ToString(); entity.time_start = \"大众\"大众; entity.time_expire = \公众\"大众; entity.mch_create_ip = AppUtils.GetIp(); entity.notify_url = ChargeHelper.BuildUrl() + \"大众WebChat/Notify.aspx\"大众; WeChatPayInterface service = new WeChatPayInterface(); PayResEntity result = service.SubmitPay(entity); if (!result.IsSuccess) { string msg = result.Message; if (msg.Contains(\公众订单已存在\"大众)) { msg = msg + \"大众,请重新下单!
\"大众; } Response.Write(\公众<script>alert('\"大众 + msg + \公众')</script>\"大众); return; } Session[\"大众pavlue\"大众] = result.arr; Response.Redirect(\公众WebChat/Pay.aspx\公众); } catch (Exception ex) { throw ex; } }
付款完成之后,会回调WebChat/Pay.aspx页面,实行订单业务功能。
public void callback() { try { WeChatPayInterface service = new WeChatPayInterface(); Stream stream = Request.InputStream; string key = \"大众KEY\"大众;//你申请的 NotifyResEntity result = service.PayResult(key, stream); if (!result.IsSuccess) { Log.Info(\"大众[威富通-微信支付回调]:\"大众 + result.Message); Response.Write(\"大众failure\公众); return; } Hashtable data = result.data; /-----------交易状态------------ SUCCESS—支付成功 REFUND—转入退款 NOTPAY—未支付 CLOSED—已关闭 PAYERROR—支付失落败(其他缘故原由,如银行返回失落败) ------------------------------------ / string out_trade_no = data[\公众out_trade_no\"大众].ToString();//商户订单号 int status = Convert.ToInt32(data[\"大众status\公众]);//返回状态码(0表示成功,非0表示失落败此字段是通信标识,非交易标识,交易是否成功须要查看 result_code 来判断) int result_code = Convert.ToInt32(data[\公众result_code\"大众]);//业务结果(0表示成功,非0表示失落败) if (status == 0 && result_code == 0) { string total_fee = data[\"大众total_fee\公众].ToString();//总金额,以分为单位,不许可包含任何字、符号 string transaction_id = data[\"大众transaction_id\公众].ToString();//平台交易单号 //此处可以在添加干系处理业务 ,更新数据库表中的记录。 int proxyid = 0; string bankbill = \"大众\"大众; ulong employeeid = 1; string comment = \公众微信支付\"大众; string billtype = \公众正常订单\公众; int payment = 24;//微信支付 string bankname = \"大众\"大众; string payer = \公众\"大众; string orderno = out_trade_no; string taobaopayno = transaction_id; decimal amountpaid = 0; if (!string.IsNullOrEmpty(total_fee)) { amountpaid = Convert.ToDecimal(total_fee) / 100; } //TODO:业务处理部分 Response.Write(\"大众success\"大众); return; } else { Log.Info(\"大众[威富通-微信支付回调]:商户订单号out_trade_no=\"大众 + out_trade_no + \"大众状态码status=\"大众 + status + \"大众,业务结果result_code=\"大众 + result_code); } } catch (Exception ex) { Log.Info(\"大众[威富通-微信支付回调]非常:\公众 + ex); } Response.Write(\"大众failure\公众); }
2.支付宝支付
场景先容
扫码支付,指用户打开支付宝钱包中的“扫一扫”功能,扫描商户针对每个订单实时天生的订单二维码,并在手机端确认支付。调用流程
https://docs.open.alipay.com/194/105170/商户系统调用支付宝预下单接口alipay.trade.precreate,得到该订单二维码图片地址。
发起轮询得到支付结果:等待5秒后调用交易查询接口alipay.trade.query通过支付时传入的商户订单号(out_trade_no)查询支付结果(返回参数TRADE_STATUS),如果仍旧返回等待用户付款(WAIT_BUYER_PAY),则再次等待5秒后连续查询,直到返回确切的支付结果(成功TRADE_SUCCESS 或 已撤销关闭TRADE_CLOSED),或是超出轮询韶光。在末了一次查询仍旧返回等待用户付款的情形下,必须立即调用交易撤销接口alipay.trade.cancel将这笔交易撤销,避免用户连续支付。
除了主动轮询,也可以通过接管异步关照得到支付结果,详见扫码异步关照,把稳一定要对异步关照做验签,确保关照是支付宝发出的。
代码片段:
private void Alipay(decimal total_fee, string orderno, string productName) { total_fee = total_fee 100;//单位:分 PayReqEntity entity = new PayReqEntity(); entity.mch_id = \"大众商户ID\"大众; string key = 商户Key\"大众\"大众; entity.key = key; entity.req_url = \公众https://pay.swiftpass.cn/pay/gateway\"大众; entity.service = \"大众pay.alipay.native\公众; entity.version = \公众2.0\公众; entity.out_trade_no = orderno; entity.body = productName; entity.attach = \"大众\"大众; entity.total_fee = Math.Round(total_fee).ToString(); entity.time_start = \"大众\"大众; entity.time_expire = \"大众\"大众; entity.mch_create_ip = AppUtils.GetIp(); entity.notify_url = ChargeHelper.BuildUrl() + \"大众Alipay/Notify.aspx\公众; WeChatPayInterface service = new WeChatPayInterface(); PayResEntity result = service.SubmitPay(entity); if (!result.IsSuccess) { string msg = result.Message; if (msg.Contains(\"大众订单已存在\"大众)) { msg = msg + \"大众,请重新下单!
\"大众; } Response.Write(\"大众<script>alert('\"大众 + msg + \"大众')</script>\"大众); return; } Session[\"大众alipay_pavlue\"大众] = result.arr; Response.Redirect(\"大众Alipay/Pay.aspx\公众); }
支付完成,同样回调Alipay/Pay.aspx
public void callback() { try { WeChatPayInterface service = new WeChatPayInterface(); Stream stream = Request.InputStream; string key = \"大众KEY\"大众;//填写自己的 NotifyResEntity result = service.PayResult(key, stream); if (!result.IsSuccess) { Log.Info(\"大众[威富通-支付宝支付回调]:\"大众 + result.Message); Response.Write(\"大众failure\"大众); return; } Hashtable data = result.data; /-----------交易状态------------ SUCCESS—支付成功 REFUND—转入退款 NOTPAY—未支付 CLOSED—已关闭 PAYERROR—支付失落败(其他缘故原由,如银行返回失落败) ------------------------------------ / //string trade_state = data[\公众trade_state\公众].ToString(); string out_trade_no = data[\"大众out_trade_no\"大众].ToString();//商户订单号 int status = Convert.ToInt32(data[\公众status\"大众]);//返回状态码(0表示成功,非0表示失落败此字段是通信标识,非交易标识,交易是否成功须要查看 result_code 来判断) int result_code = Convert.ToInt32(data[\"大众result_code\公众]);//业务结果(0表示成功,非0表示失落败) if (status == 0 && result_code == 0) { string total_fee = data[\"大众total_fee\公众].ToString();//总金额,以分为单位,不许可包含任何字、符号 string transaction_id = data[\公众transaction_id\公众].ToString();//平台交易单号 //此处可以在添加干系处理业务 ,更新数据库表中的记录。 int proxyid = 0; string bankbill = \"大众\公众; ulong employeeid = 1; string comment = \"大众支付宝支付\"大众; string billtype = \"大众正常订单\公众; int payment = 23;//威富通-支付宝支付 string bankname = \公众\"大众; string payer = \"大众\公众; string orderno = out_trade_no; string taobaopayno = transaction_id; decimal amountpaid = 0; if (!string.IsNullOrEmpty(total_fee)) { amountpaid = Convert.ToDecimal(total_fee) / 100; } //TODO:业务处理部分 Response.Write(\公众success\"大众); return; } else { Log.Info(\"大众[威富通-支付宝支付回调]:商户订单号out_trade_no=\公众 + out_trade_no + \公众状态码status=\公众 + status + \公众,业务结果result_code=\"大众 + result_code); } } catch (Exception ex) { Log.Info(\"大众[威富通-支付宝支付回调]非常:\"大众 + ex); } Response.Write(\"大众failure\"大众); }
二、充值体系
任何一家公司做生意的都会利用支付业务,这里以SAAS行业支付为例。最基本的充值业务架构知足一下基本需求用户账户中央用户可充值,可查看订单和购买商品代理商、发卖等营销部门可以查看古迹报表订单天生流程在实际生产环境中中,订单的流程也是较为主要的一环。
防止重复支付
支付完成,回调的时候检测订单状态。已支付的就不再实行。
如何担保支付同等性在实际生产环境中中,总会发生支付接口支付成功,回调实行订单业务失落败的情形,大略的办法是可以增加一个单独检讨业务,定时对不一致的订单进行二次实行。
三、总结
基本的充值体系是通用的。订单业务量大的可以增加行列步队处理。在担保同等性方面,我们在该架构上还有很多细节可以完善。
四、参考
https://pay.weixin.qq.com/wiki/doc/api/index.htmlhttps://docs.open.alipay.com/194/106078/