一、Native支付介绍
微信Native支付是微信支付的一种支付模式,它提供了原生应用支付的能力,支持App、PC、移动Web等多种支付场景。Native支付与传统的H5支付相比拥有更好的支付流程控制能力和更高的用户支付体验。同时,Native支付还可以提供更多的营销能力,如商家发放优惠券、代金券,提高消费者的回头率和忠诚度。
二、Native支付流程
Native支付的流程相比H5支付复杂,但是更加灵活可控。流程如下:
- App端生成订单,后端调用微信支付统一下单接口,获取预支付交易会话标识prepay_id。
- App端调用微信支付sdk,传入预支付交易会话标识prepay_id、appid、partnerid、nonce_str、timestamp、package、sign等参数,生成签名后发起微信支付请求。
- 微信支付系统完成付款后,会跳转回到App,并将支付结果返回给App。
- App端接收到支付结果,确认支付成功,通过查询订单接口确认是否真正的支付成功。
- 如果支付成功,商户后台收到微信支付系统的支付通知,可以更新订单状态,发放代金券、红包等相关的优惠活动。
三、Native支付的配置步骤
接下来我们将详细的介绍如何进行微信Native支付的配置。
1、注册微信开放平台
在使用微信支付前,需要申请微信支付账户,注册微信开放平台账户,并开发者审核通过。
2、开通微信支付
提交微信支付相关信息并审核通过,获得微信支付的商户号、APPID、API密钥等信息。
3、生成API密钥
API密钥用于签名、加密等操作,需要创建并保管好。生成API密钥需要在微信商户平台完成,打开商户平台,依次单击「账户中心」、「API安全」、「密钥管理」。
四、Native支付的开发步骤
接下来我们将介绍如何进行微信Native支付的开发。
1、微信支付的SDK集成
微信支付的SDK提供了开发Native支付的常用组件,包括支付、重置密码、充值、查询订单、发红包等等。
代码实例:
public class WechatPayActivity extends Activity { private IWXAPI api; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //创建微信API对象 api = WXAPIFactory.createWXAPI(this, "您的APPID"); //调用API注册 api.registerApp("您的APPID"); //构造支付请求 PayReq request = new PayReq(); request.appId = "您的APPID"; request.partnerId = "您的商户号"; request.prepayId= "从服务器端获取的prepay_id"; request.packageValue = "Sign=WXPay"; request.nonceStr= "随机字符串"; request.timeStamp= "时间戳"; request.sign= "签名"; //发起支付请求 api.sendReq(request); finish();//关闭当前Activity } }
2、后端的开发
后端主要提供获取prepay_id接口、验签、异步通知等接口。
代码实例:
/** * 获取prepay_id,供APP调用 * @param request * @return */ @RequestMapping(value = "/getPrepayId") @ResponseBody public WXPrepayResult getPrepayId(HttpServletRequest request) { WXPrepayResult result = new WXPrepayResult(); try { //封装微信支付请求参数 WXPayConfig config = WXPayConfig.getInstance(); WxPayVo vo = new WxPayVo(); vo.setAppid(config.getAppID()); vo.setMch_id(config.getMchID()); vo.setNonce_str(RandomUtil.generateUUID()); vo.setBody(request.getParameter("body")); vo.setOut_trade_no(request.getParameter("out_trade_no")); vo.setTotal_fee(request.getParameter("total_fee")); vo.setSpbill_create_ip(request.getParameter("spbill_create_ip")); vo.setNotify_url(config.getNotifyUrl()); vo.setTrade_type(config.getTradeType()); vo.setOpenid(request.getParameter("openid")); vo.setSign_type("MD5"); vo.setSign(SignatureUtil.sign(WXPayUtil.beanToMap(vo), config.getKey())); //调用微信支付统一下单接口,获取预支付交易会话标识prepay_id MapresultWX = WXPayUtil.xmlToMap(WXPayUtil.mapToXml(WXPayUtil.beanToMap(vo))); resultWX = WXPayUtil.xmlToMap(HttpUtils.post(WXPayConstants.UNIFIEDORDER_URL, WXPayUtil.mapToXml(WXPayUtil.beanToMap(vo)))); if (WXPayConstants.SUCCESS.equals(resultWX.get(WXPayConstants.RETURN_CODE))) { //验签 if (SignatureUtil.checkIsSignValidFromMap(resultWX, config.getKey())) { //获取prepay_id成功 result.setPrepayId(resultWX.get("prepay_id")); result.setResult_code("SUCCESS"); result.setReturn_code(WXPayConstants.SUCCESS); } else { //签名错误 result.setResult_code("FAIL"); result.setReturn_code("SIGN_INVALID"); } } else { //获取prepay_id失败 result.setReturn_code(resultWX.get(WXPayConstants.RETURN_CODE)); result.setReturn_msg(resultWX.get(WXPayConstants.RETURN_MSG)); result.setResult_code("FAIL"); } } catch (Exception e) { //异常处理 result.setResult_code("FAIL"); result.setReturn_msg(e.getMessage()); } return result; }
五、Native支付的安全保障
Native支付在支付过程中需要保证安全性,以下是保证安全的措施。
1、数据的加密传输
所有的数据在传输的时候都采用了数据加密的方式来进行传输,保证了数据的完整性和安全性。
2、商户身份的验证
在支付过程中需要对商户的身份进行认证,确保每一个支付请求都来自合法的商户。
3、支付请求的合法性验证
在支付请求发起前,需要验证支付请求的合法性,防止支付请求被修改、篡改。
六、结语
本文介绍了微信Native支付的概念、流程、配置步骤、开发步骤、以及支付安全等相关内容。希望对大家进行微信Native支付的开发有所帮助。