package com.walker.pay.wechat.v2;
import com.walker.infrastructure.arguments.Variable;
import com.walker.pay.Order;
import com.walker.pay.PayContext;
import com.walker.pay.ResponsePay;
import com.walker.pay.response.ScanOrderResponsePay;
import com.walker.pay.wechat.Constants;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import java.util.Map;
/**
* 微信支付,V2版本的扫码订单生成器。
* 会返回商品连接的二维码,用户通过微信APP扫码即可完成付款。
* @author 时克英
* @date 2023-01-16
*/
public class ScanOrderGenerator extends BaseOrderGenerator {
public ScanOrderGenerator(RestTemplate restTemplate){
this.setRestTemplate(restTemplate);
}
@Override
protected ResponsePay invoke(PayContext payContext, Order platformOrder) {
WechatV2PayContext context = (WechatV2PayContext)payContext;
String request = this.toRequest(payContext.getProviderPayType(), platformOrder
, context.getAppIdConfig().getStringValue(), context.getMchIdConfig().getStringValue(), context.getApiKeyConfig().getStringValue());
ResponseEntity entity = this.getRestTemplate().postForEntity(Constants.URL_ORDER_V2, request, String.class);
if(entity == null){
throw new RuntimeException("调用'微信扫码'订单返回空数据, orderId = " + platformOrder.getId());
}
Map responseMap = SignUtils.decodeXml(entity.getBody());
if(responseMap == null){
throw new RuntimeException("调用'微信扫码'订单返回数据转换为空: SignUtils.decodeXml() == null");
}
if(logger.isDebugEnabled()){
logger.debug(responseMap.toString());
}
ScanOrderResponsePay responseValue = new ScanOrderResponsePay();
if(responseMap.get("return_code").equals("FAIL")){
// logger.error("调用微信统一下单远程接口失败:" + responseMap.get("return_msg"));
responseValue.setStatus(false);
responseValue.setMessage(responseMap.get("return_msg"));
} else {
responseValue.setCodeUrl(responseMap.get("code_url"));
}
return responseValue;
}
@Deprecated
@Override
protected ResponsePay invoke(String providerPayType, Order platformOrder, Map configuration) {
// HttpHeaders headers = new HttpHeaders();
// headers.setContentType(MediaType.parseMediaType("application/json; charset=UTF-8"));
throw new UnsupportedOperationException("该方法已废弃!");
/*String request = this.toRequest(providerPayType, platformOrder
, configuration.get(Constants.CONFIG_KEY_APP_ID).getStringValue()
, configuration.get(Constants.CONFIG_KEY_MCH_ID).getStringValue()
, configuration.get(Constants.CONFIG_KEY_API_KEY).getStringValue());
ResponseEntity entity = restTemplate.postForEntity(Constants.URL_ORDER_V2, request, String.class);
if(entity == null){
throw new RuntimeException("调用'微信扫码'订单返回空数据, orderId = " + platformOrder.getId());
}
Map responseMap = SignUtils.decodeXml(entity.getBody());
if(responseMap == null){
throw new RuntimeException("调用'微信扫码'订单返回数据转换为空: SignUtils.decodeXml() == null");
}
if(logger.isDebugEnabled()){
logger.debug(responseMap.toString());
}
ScanOrderResponsePay responseValue = new ScanOrderResponsePay();
if(responseMap.get("return_code").equals("FAIL")){
responseValue.setStatus(false);
responseValue.setMessage(responseMap.get("return_msg"));
} else {
responseValue.setCodeUrl(responseMap.get("code_url"));
}
return responseValue;*/
}
// private String toRequest(Order platformOrder, String appId, String mchId, String apiKey){
// List> packageParams = new LinkedList<>();
// //appid 应用ID
// packageParams.add(new KeyValue<>("appid", appId));
// //商品描述,显示在app支付界面中标题
// packageParams.add(new KeyValue("body", platformOrder.getTitle()));
// //该属性,可以传递业务自己的自定义参数
// packageParams.add(new KeyValue("detail", platformOrder.getAttach()));
// //商户号 mch_id
// packageParams.add(new KeyValue("mch_id", mchId));
// //随机字符串 nonce_str
// packageParams.add(new KeyValue("nonce_str", StringUtils.generateRandomNumber(6)));
//
// packageParams.add(new KeyValue("notify_url", platformOrder.getNotifyUrl()));
// //商户订单号
// packageParams.add(new KeyValue("out_trade_no", String.valueOf(platformOrder.getId())));
// //ip
// packageParams.add(new KeyValue("spbill_create_ip", platformOrder.getIp()));
// //总价格 分单位
// packageParams.add(new KeyValue("total_fee",String.valueOf(platformOrder.getTotalMoney())));
// // 支付类型
// packageParams.add(new KeyValue("trade_type", "NATIVE"));
//
// String sign = SignUtils.getSign(packageParams, apiKey);
// //签名 sign
// packageParams.add(new KeyValue<>("sign", sign));
// return SignUtils.toXml(packageParams);
// }
// public void setRestTemplate(RestTemplate restTemplate) {
// this.restTemplate = restTemplate;
// }
// private RestTemplate restTemplate;
}