微信浏览器中进行支付宝支付

B端项目使用的是支付宝手机网页支付,微信浏览器中屏蔽了支付宝的功能。上有政策下有对策,支付宝也有应对的办法,下来就来说一说支付宝手机网站支付。

第一步:开发准备工作
登录支付宝平台(需要实名认证的支付宝账号),根据实际情况创建应用。
选择自用型应用,添加应用功能。
配置应用环境
支付宝中使用的是RSA2非对称密钥结构。
第二步:快速接入
下载服务端SDK(software Development Kit),包含了java、php、.net三个语言版本,封装了签名验签、http请求等功能。但是我们的项目中没有使用sdk,一般情况下sdk是用在原生的安卓和ios项目中,但是我们的项目使用的是混合式开发。
准备工作:支付宝给出了在微信浏览器中支付的解决方法,而且官网中有demo。
我下载了demo,其中有两个比较重要的文件,一个是ap.js,另一个是pay.htm(支付宝在微信浏览器中的引导页,会引导用户在浏览器中访问此链接),支付页面和pay.htm页面必须引入ap.js文件。

大概思路是前台点击支付宝支付,然后调起后台的拼装支付参数的方法,返回一个拼装好的url,将这个url在前台赋值给一个a标签,我写了一个自定义事件,为了触发a标签前去访问拼装好的链接。

微信浏览器中进行支付宝支付_第1张图片
注意:ap.js中有个地址要修改下。
微信浏览器中进行支付宝支付_第2张图片

修改为本地的路径。前台代码就是这些就可以调起支付宝了。

后台代码:

/**
 * 后台组装好请求数据,前台以form表单的形式向支付宝手机网页
 * 支付接口发起请求
 * @param saleMoney
 * @param orderNumber
 * @param orderTitle
 * @param description
 */
@RequestMapping("/alipayPayRequest")
@ApiOperation(value="支付宝付款起调的接口",httpMethod="POST",response=JsonUtil.class,notes="支付宝付款起调的接口---/alipayPayRequest")
public void alipayPayRequest(
@ApiParam(required=true,name="orderNumber",value="订单编号")@RequestParam(value="orderNumber") String orderNumber,
@ApiParam(required=true,name="orderTitle",value="订单标题")@RequestParam(value="orderTitle") String orderTitle,
@ApiParam(required=true,name="description",value="订单描述")@RequestParam(value="description") String description){
try{
if(orderNumber !=null && !orderNumber.equals("")
&& orderTitle !=null && !orderTitle.equals("")
&& description !=null && !description.equals("")
){
OrderCommCai orderCommCai = orderCommCaiService.get(orderNumber);//根据综合采购单id来查找综合采购单
String saleMoney = orderCommCai.getOrderZongCommPrices().toString();
// 公共请求参数
Map param = new HashMap<>();             
param.put("app_id", AlipayConfig.appId);    // 应用appId
param.put("method", "alipay.trade.wap.pay"); // 接口名称
param.put("format", "json"); //数据类型
param.put("charset", AlipayConfig.input_charset);//编码格式
param.put("timestamp", DatetimeUtil.formatDateTime(new Date()));//发送请求时间
param.put("version", "1.0");//调用接口版本,固定为1.0
param.put("notify_url", AlipayConfig.notify_url);// 支付宝服务器主动通知商户服务
param.put("sign_type", AlipayConfig.sign_type);//签名类型          
// 支付业务请求参数
Map pcont = new HashMap<>();             
pcont.put("out_trade_no", orderNumber);// 订单号(综合采购单编号)
pcont.put("total_amount", String.valueOf(saleMoney));// 交易金额
pcont.put("subject", orderTitle); // 订单标题
pcont.put("body", description); // 对交易或商品的描述
pcont.put("product_code", "QUICK_WAP_WAY");                  // 销售产品码
param.put("biz_content", JSON.toJSONString(pcont));          // 业务请求参数  不需要对json字符串转义
param.put("return_url", AlipayConfig.RETURN_URL);
Map payMap = new HashMap<>();
try {
param.put("sign", PayUtil.getSign(param, AlipayConfig.private_key)); //业务请求参数
payMap.put("orderStr", PayUtil.getSignEncodeUrl(param, true));//拼接好的url
} catch (Exception e) {
e.printStackTrace();
}           
map1.put("msg", "成功");
map2.put("result", payMap);
}else{
map1.put("msg", "参数不全");
}
} catch (BusinessException e) {
e.printStackTrace();
map1.put("msg", "发生后台异常");
}
map.put("data", map2);
map.put("result", map1);
JsonUtil.writeJson(response, JsonUtil.objectToJson(map));
}

代码逻辑:
将公共参数放进map集合中,然后将请求参数放进另一个map1集合中。将map1转换为json字符串,然后将map1放进map中去,键值为biz_content,然后对参数进行签名,将签名后得到的字符串放进map集合中,键值是sign,将map集合进行urlEncode,返回的就是拼接好的支付链接.
混合式开发基本都是这种写法,只是参数的值可能会有变动。
请求参数说明:
请求地址:https://openapi.alipay.com/gateway.do
公共请求参数,根据自己的情况来选择参数,有的是必填,有的是非必填。我在代码中主要用的是必填的参数。
app_id:支付宝分配给开发者的应用id
method:接口名称
charset:请求使用的编码格式
sign_type:算法生成签名字符串使用的签名算法类型目前支持RSA和RSA2
sign:商户请求参数的签名串
timestamp:发送请求的时间,格式yyyy-MM-dd HH:mm:ss
version:调用接口版本,固定为1.0
notify_url:支付宝服务器主动通知商户服务器里指定的页面http/https路径
return_url:支付成功后跳转的页面
biz_content:业务请求参数集合,最大长度不限,除公共参数外所有请求参数必须放在这个参数中传递。
请求参数:
subject:商品标题、交易标题、订单标题、订单关键字等
out_trade_no:商户网站唯一订单号
total_amount:订单金额,单位为元,精确到小数点后两位
product_code:销售产品码,商家和支付宝签约的产品码。填写固定值QUICK_WAP_WAY

你可能感兴趣的:(微信浏览器中进行支付宝支付)