Login expired. Please log in again.

Feedback

0/300

Feedback

Submitted successfully

ok

Feedback

Network exception, please try again later

ok

开发指引


接口流程图


步骤1 用户在商户侧完成下单,使用微信支付;


步骤2 由商户后台向微信支付发起下单请求;


步骤3 微信支付校验商户权限;


步骤4 微信支付返回支付跳转url 给商户,用于调起微信支付;


步骤5 商户将支付跳转url 返回给前端页面


步骤6 商户访问支付跳转url(由于访问“支付跳转url”时,微信会判断请求来源refer_url,所以需在微信后台录入请求来源,即“支付域名”。)


步骤7 由支付跳转url 拉起微信支付收银台


步骤8 拉起收银台的同时关闭中转页面。


步骤9 用户完成支付,点击完成可返回商户页面。

H5支付获取用户IP指引

H5支付要求商户在统一下单接口中上传用户真实ip地址“spbill_create_ip”,为保证微信端获取的用户ip地址与商户端获取的一致,提供了以下获取用户ip的指引,希望对大家有所帮助。

没有代理的情况

在商户的前端接入层没有做代理的情况下获取ip的方式比较简单,直接获取'REMOTE_ADDR '即可。

有代理的情况

在有代理的情况下,因为要代替客户端去访问服务器,所以,当请求包经过反向代理后,在代理服务器这里这个IP数据包的IP包头做了修改,最终后端WEB服务器得到的数据包的头部源IP地址是代理服务器的IP地址。这样一来,后端服务器的程序就无法获取用户的真实ip。


nginx有代理的情况:

在nginx中配置中加入

vi /usr/local/apache/conf/httpd.conf
Include conf/extra/httpd-remoteip.conf
vi /usr/local/apache/conf/extra/httpd-remoteip.conf
LoadModule remoteip_module modules/mod_remoteip.so
RemoteIPHeader X-Forwarded-For
RemoteIPinternalProxy 127.0.0.1


Apache有代理的情况:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

代码示例


string GetClientIp(CgiInput * poInput) {
	string client_ip = "";
	string strClientIPList;
	GetHttpHeader("X-Forwarded-For", strClientIPList);

	if (strClientIPList.empty()) {
		GetHttpHeader("X-Real-IP", strClientIPList);
	}

	if (!strClientIPList.empty()) {
		size_t iPos = strClientIPList.find(",");
		if (iPos != std::string::npos) {
			client_ip = strClientIPList.substr(iPos);
		} else {
			client_ip = strClientIPList;
		}
	}

	if (client_ip.empty()) {
		GetHttpHeader("PROXY_FORWARDED_FOR", strClientIPList);
		// 做下兼容 
		if (strClientIPList.empty()) {
			client_ip = getRemoteAddr();
		} else {
			size_t iPos = strClientIPList.find(",");
			if (iPos != std::string::npos) {
				client_ip = strClientIPList.substr(iPos);
			} else {
				client_ip = strClientIPList;
			}
		}
	}
	if (!MMPayCommFunc::IsIp(client_ip))
		client_ip = getRemoteAddr();
	return client_ip;
}

常见问题

回调页面

正常流程用户支付完成后会返回至发起支付的页面,如需返回至指定页面,则可以在MWEB_URL后拼接上redirect_url参数,来指定回调页面。
如您希望用户支付完成后跳转至https://www.wechatpay.com.cn,则可以做如下处理:


假设您通过统一下单接口获到的MWEB_URL= https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096


则拼接后的地址为MWEB_URL= https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096&redirect_url=https%3A%2F%2Fwww.wechatpay.com.cn

注意:

1、需对redirect_url进行urlencode处理;

2、由于设置redirect_url后,回跳指定页面的操作可能发生在:1,微信支付中间页调起微信收银台后超过5秒 2,用户点击“取消支付“或支付完成后点“完成”按钮。因此无法保证页面回跳时,支付流程已结束,所以商户设置的redirect_url地址不能自动执行查单操作,应让用户去点击按钮触发查单操作。回跳页面展示效果可参考下图。


其它常见错误

问题 问题说明 解决方案
网络环境未能通过安全验证,请稍后再试 1. 商户侧统一下单传的终端IP(spbill_create_ip)与用户实际调起支付时微信侧检测到的终端IP不一致导致的,这个问题一般是商户在统一下单时没有传递正确的终端IP到spbill_create_ip导致,详细可参见客户端ip获取指引

2. 统一下单与调起支付时的网络有变动,如统一下单时是WIFI网络,下单成功后切换成4G网络再调起支付,这样可能会引发我们的正常拦截,请保持网络环境一致的情况下重新发起支付流程
商家参数格式有误,请联系商家解决 1. 当前调起H5支付的referer为空导致,一般是因为直接访问页面调起H5支付,请按正常流程进行页面跳转后发起支付,或自行抓包确认referer值是否为空

2. 如果是APP里调起H5支付,需要在webview中手动设置referer,如(
Map extraHeaders = new HashMap();
extraHeaders.put("Referer", "商户申请H5时提交的授权域名");//例如 http://www.baidu.com ))

商家存在未配置的参数,请联系商家解决 1,当前调起H5支付的域名(微信侧从referer中获取)与申请H5支付时提交的授权域名不一致,如需添加或修改授权域名,请登陆商户号对应的商户平台--"产品中心"--"开发配置"自行配置

2,如果设置了回跳地址redirect_url,请确认设置的回跳地址的域名与申请H5支付时提交的授权域名是否一致
支付请求已失效,请重新发起支付 统一下单返回的MWEB_URL生成后,有效期为5分钟,如超时请重新生成MWEB_URL后再发起支付
请在微信外打开订单,进行支付 H5支付不能直接在微信客户端内调起,请在外部浏览器调起
IOS:签名验证失败
安卓:系统繁忙,请稍后再试
1,请确认同一个MWEB_URL只被一个微信号调起,如果不同微信号调起请重新下单生成新的MWEB_URL

2,如MWEB_URL有添加redirect_url,请确认参数拼接格式是否有误,是否有对redirect_url的值做urlencode,可对比以下例子格式:

https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096&redirect_url=https%3A%2F%2Fwww.wechatpay.com.cn


About  WeChat  Pay

Powered By Tencent & Tenpay Copyright©

2005-2024 Tenpay All Rights Reserved.

Contact Us
Wechat Pay Global

WeChat Pay Global