[关闭]
@xiaoyixy 2018-03-07T14:38:04.000000Z 字数 4232 阅读 2141

新增支付方式实现思路(以微信支付为例)

目录

微信扫码支付模式二

原生支付模式二时序图

数据库

找到 PayType 表,添加一条支付类型。
如:

PayTypeID PayTypeName PayTypeDesc Period PaymentPage PayRate IsNet IsPayWhenRecv OrderNumber IsOnlineShow ProductSaleType isInvoice
5 微信支付 微信支付 实时到账 wcpay 0.000000 1 0 1 1 0 0

找到 PayType_Sequence 表,添加一条记录。(待确认)

SysNo CreateTime
5 2018-03-01 10:17:02.927

找到 DBC_Config 表, 添加微信扫码支付接入接口认证相关参数字段记录(主要供WcPayMode.cs调用)

* 按照 微信统一下单接口 需要的认证参数新增字段

SysNo DbcKey DbcValue Description CreateTime CreateUser UpdateTime UpdateUser
sysno pay_WcPay_appid XXXXXXX 安全校验码(Key) 2018-03-01 16:47:24.000 系统管理员 2018-03-01 15:43:34.000 系统管理员
101 pay_WxPay_key 1bec493fda794aef4f1556321fbb2257 商户平台密钥key
102 pay_WxPay_app_id wxc07579f885b7f399 企业号corpid
103 pay_WxPay_mch_id 1246169201 微信支付分配的商户号
104 pay_WxPay_notify_url http://www.tp-linkshop.com.cn/Pay/WcPay_NotifyReturn 微信异步通知回调接口

[Obsolete] 新增微信支付流水记录表 SO_Wcpay, 结构如下

SysNo SOSysNo WcpayTradeNo
记录编号 订单编号 流水号
  1. // 可能需要维护的数据表:
  2. PayType
  3. ? PayType_Sequence
  4. DBC_Config
  5. SO_Wcpay
  6. RO_Refund
  7. netpay
  8. finance_netpay
  9. finance_soincome
  10. finance_soincome_voucher
  11. do_master
  12. ro_master
  13. Waybill_Master
  14. Stock
  1. // 可能需要维护的页面:
  2. ../Finance/RefundSingle.aspx?url=退款单维护
  3. ../Finance/NetPaySearch_DBC.aspx?url=网上支付查询
  4. (待确认)../Finance/SaleIncomeSearch_DBC.aspx?url=应收款管理
  5. ../Sale/ROSearchWX.aspx?url=退货单维护
  6. ../Sale/ROSummary_DBC.aspx?url=退货单统计
  7. ../Sale/SOManager_DBC.aspx?url=销售单维护

前台

找到 \MVC\MVC.Web\Views\Shopping\_PayType.cshtml
编辑:

  1. // 添加
  2. int wcpaySysNo = 5; // 微信支付的SysNo
  3. // 定位到 if (p.SysNo == onlinePaySysNo)
  4. if (p.SysNo == onlinePaySysNo)
  5. {
  6. ...
  7. }
  8. // 修改
  9. else if (p.SysNo == alipaySysNo || p.SysNo == wcpaySysNo)
  10. {
  11. <div class="paytypename">支付宝/微信支付:<span class="c_text3">(@alipayDesc)</span></div>
  12. <div class="paytype-list pr paytypebottom">
  13. <ul>
  14. <li class="paytype-list pr">
  15. <div class="item-radio pa">
  16. <input type="radio" name="sel_pay" class="hidden" id="PayType@(p.SysNo)" @chk value="@p.SysNo" />
  17. <label class="@chk2" style="display: block;" id="lab_@(p.SysNo)" for="PayType@(p.SysNo)" onclick=" DBCMvcShopping.Check.RadioToggle('lab_@(p.SysNo)');DBCMvcShopping.Check.Sel_PayType(@(p.SysNo), '@Html.Raw(p.PayTypeName)', ''); "></label>
  18. </div>
  19. <label for="PayType@(p.SysNo)">
  20. <img width="152" height="37" id="PayTypePic@(p.SysNo)" class="payTypeImg pa @(i == 0 ? "active" : "")" src="@Url.Content(bankIconPath + "alipay.jpg")"/>
  21. </label>
  22. </li>
  23. <li class="paytype-list pr">
  24. <div class="item-radio pa">
  25. <input type="radio" name="sel_pay" class="hidden" id="PayType@(p.SysNo)" @chk value="@p.SysNo" />
  26. <label class="@chk2" style="display: block;" id="lab_@(p.SysNo)" for="PayType@(p.SysNo)" onclick=" DBCMvcShopping.Check.RadioToggle('lab_@(p.SysNo)');DBCMvcShopping.Check.Sel_PayType(@(p.SysNo), '@Html.Raw(p.PayTypeName)', ''); "></label>
  27. </div>
  28. <label for="PayType@(p.SysNo)">
  29. <img width="152" height="37" id="PayTypePic@(p.SysNo)" class="payTypeImg pa @(i == 0 ? "active" : "")" src="@Url.Content(bankIconPath + "wcpay.jpg")"/>
  30. </label>
  31. </li>
  32. </ul>
  33. </div>
  34. }
  35. // 添加样式
  36. ul li.paytype-list {
  37. float: left;
  38. display: inline-block;
  39. width: 227px;
  40. height: 60px;
  41. }

后台

  1. public class WcPay : Pay
  2. {
  3. public override string BuilderForm(GroupShoppingApplicationInfo g)
  4. {
  5. ...
  6. }
  7. public override string BuilderForm(SOInfo so)
  8. {
  9. ...
  10. }
  11. public override string PayNotifyResult(HttpRequestBase request)
  12. {
  13. ...
  14. }
  15. public override bool PayResult(HttpRequestBase request, out string msg)
  16. {
  17. ...
  18. }
  19. }

新增类 WcPayMode.cs(主要用来存储构建调用请求 API 的参数), 并完成初始化

  1. public class WcPayMode
  2. {
  3. private string _price;
  4. public string body { get; set; }
  5. public string gateway
  6. {
  7. get { return DbcConfigManager.GetInstance().GetDBCConfigString("pay_WcPay_appid"); }
  8. }
  9. public string price
  10. {
  11. get { return _price; }
  12. set { _price = Convert.ToDecimal(value).ToString("#########0.00"); }
  13. }
  14. // 省略余下部分必要参数
  15. ...
  16. }

重写 WcPay.csBuilderForm 方法, 构建 XML 参数

  1. public override string BuilderForm(SOInfo so)
  2. {
  3. var builder = new StringBuilder();
  4. try
  5. {
  6. var mode = new WcPayMode
  7. {
  8. price = so.GetTotalAmt().ToString(CultureInfo.InvariantCulture),
  9. ...
  10. };
  11. var sParaTemp = new SortedDictionary<string, string>
  12. {
  13. {"price", mode.price}
  14. ...
  15. };
  16. var helper = new More.NetPayHelper();
  17. // 集成签名
  18. var dics = helper.BuildRequestPara(sParaTemp, mode.key, mode.sign_type, mode.input_charset);
  19. // 生成 HTML 表单
  20. builder.Append(helper.BulidFormHtml(dics, mode.gateway, "get"));
  21. }
  22. catch (BizException)
  23. {
  24. }
  25. catch (Exception)
  26. {
  27. // ignored
  28. }
  29. return builder.ToString();
  30. }

功能:
1. 接收微信支付结果,回复接收情况,通知微信后台系统不再发送该单的支付通知
2. 查询支付状态,作为是否发货的判断依据

主动查询支付状态,作为是否发货的判断依据

* 因为 code_url 有效期为2小时,过期后扫码不能再发起支付

数据库记录插入/更新?

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注