iOS 常见问题汇总

iOS-微信支付(二)-了解服务器签名、加密

2017-07-26  本文已影响964人  charleswang

一、声明:

一般微信支付签名、加密都在服务器端做的,在iOS中只需要调用服务器的接口获取(partnerid、prepayid、noncestr、timeStamp、sign)数据,然后调用微信支付,为了更好的了解微信支付,此篇文章简单的介绍服务器关于微信支付的加密签名。微信支付流程

实现的基本的步骤:

下面是请求微信服务器进行一次签名的一部分的必传的参数,具体的参数见微信的开发文档

字段名 字段
应用的ID appid
商户号 mch_id
随机字符串 nonce_str
商品描述 body
商品详情 detail
商户订单号 out_trade_no
总金额 total_fee
终端IP spbill_create_ip
通知地址 notify_url
交易类型 trade_type
签名 sign
商户秘钥 key
// 第1步-签名订单信息
// 第一点:获取客户端传递过来的参数
// req:客户端请求
// resp:响应客户端请求
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
String name = req.getParameter("name");//客户端传的参数
String price = req.getParameter("price");//客户端传的参数
// 第二点:设置访问微信支付服务器请求数据类型
resp.reset();
resp.setHeader("ContentType", "text/xml");
// 第三点:创建请求微信支付服务器参数集合// 做了请求封装
// 微信写好一个封装案例,你可以根据服务器需求,自己定义网络请求框架
PrepayIdRequestHandler handler = new PrepayIdRequestHandler(req, resp);
// 统一下单的接口(调用微信支付服务器需要的接口)--->公开的
handler.setGateUrl(ConstantUtil.URL_UNIFIEDORDER);
// 设置密钥
handler.setKey(PARTNER_KEY);
// 设置应用的ID
handler.setParameter("appid", APP_ID);
// 商户号
handler.setParameter("mch_id", PARTNER_ID);
// 随机字符串
handler.setParameter("nonce_str", WXUtil.getNonceStr());
// 商品描述(例如:天天爱消除-游戏充值)
handler.setParameter("body", "爱学宝-笔记本");
// 商户订单号(自己服务器生成订单号)
String out_trade_no = OrderUtils.getOrderNumber();
handler.setParameter("out_trade_no", out_trade_no);
// 总金额
handler.setParameter("total_fee", price);
// 终端IP(客户端IP)
handler.setParameter("spbill_create_ip", req.getRemoteAddr());
// 通知地址(微信服务器回调商户服务器页面)
handler.setParameter("notify_url", ConstantUtil.NOTIFY_URL);
// 交易类型
handler.setParameter("trade_type", "APP”);
// 第四点:对我们订单信息进行签名
//将这些必要的参数按顺序拼接起来(A-Z),key不参与排序,拼接在末尾,再进行MD5加密生成sign
String sign = handler.createMD5Sign();
// 设置签名
handler.setParameter("sign", sign);
<xml>
   <return_code><![CDATA[SUCCESS]]></return_code>
   <return_msg><![CDATA[OK]]></return_msg>
   <appid><![CDATA[wx2421b1c4370ec43b]]></appid>
   <mch_id><![CDATA[10000100]]></mch_id>
   <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>
   <sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>
   <result_code><![CDATA[SUCCESS]]></result_code>
   <prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
   <trade_type><![CDATA[APP]]></trade_type>
</xml>

进行二次签名的必传的参数:

字段名 字段
应用ID appid
商户号 partnerid
预支付交易会话ID prepayid
扩展字段 package
随机字符串 noncestr
时间戳 timestamp
签名 sign
String noncestr = (String) paramsMap.get("nonce_str");
String timestamp = WXUtil.getTimeStamp();
// 密钥
handler.setKey(PARTNER_KEY);//秘钥排在最后
// 设置应用的ID
handler.setParameter("appid", APP_ID);
// 预付单ID
handler.setParameter("prepayid", prepay_id);
// 扩展字段
handler.setParameter("package", "Sign=WXPay");
// 商户号
handler.setParameter("partnerid", PARTNER_ID);
// 随机字符串
handler.setParameter("noncestr", noncestr);
// 时间戳
handler.setParameter("timestamp", timestamp);

// 进行二次签名(签名参数不一样)// 第一次签名:对订单信息签名,获取prepay_id// 第二次签名:对支付信息进行签名
sign = handler.createMD5Sign();
// 第4步-将签名信息返回客户端(xml、json都可以)// 采用Json解析(构建json--->返回客户端)
OrderBean orderBean = new OrderBean();
orderBean.setAppid(APP_ID);
orderBean.setNoncestr(noncestr);
orderBean.setPackageValue("Sign=WXPay");
orderBean.setPartnerid(PARTNER_ID);
orderBean.setPrepayid(prepay_id);
orderBean.setTradeType((String) paramsMap.get("trade_type"));
orderBean.setSign(sign);
orderBean.setTimestamp(timestamp);
orderResult.setOrderBean(orderBean);

下面是在微信支付中遇到的问题和注意事项:

下一章介绍iOS中的客户端的调用

上一篇 下一篇

猜你喜欢

热点阅读