Android,위 챗 결제 기능 구현

Android APP 위 챗 결제 기능 을 개발 하려 면 세 가지 절 차 를 완성 해 야 합 니 다.첫 번 째 단 계 는 선불 주문 서 를 생 성 하고 두 번 째 단 계 는 위 챗 결제 파 라미 터 를 생 성 하 며 세 번 째 단 계 는 위 챗 APP 결 제 를 조정 해 야 합 니 다.심 사 를 통과 해 야 하 는 앱 애플 리 케 이 션 외 에 위 챗 결제 인터페이스 권한 을 얻 은 다음 에 해당 하 는 상호,API 키 를 가 져 와 야 한다.이 둘 중 하나 가 빠 지면 안 되 고 앱 위 챗 결제 에서 도 사용 해 야 한다.
상점 번호,API 키 획득
위 챗 오픈 플랫폼 에서 심 사 를 통과 한 앱 앱 앱 을 확인 하고 결제 기능 을 신청 할 지 여 부 를 확인 합 니 다.신청 이 완료 되면 위 챗 결제|상점 플랫폼 에 로그 인 합 니 다http://pay.weixin.qq.com해당 하 는 상점 번호,API 키 를 확인 합 니 다.
신청 위 챗 결제 인터페이스

로그 인 상점 플랫폼

상점 번호 보기

>API 키 가 져 오기


STEP 1:선불 주문 생 성
상품 정보,사업 자 정 보 를 Basic NameValuePair 로 저장 한 다음 List 목록 에 저장 하고 xml 문자열 형식 을 만들어 POST 방식 으로 위 챗 이 제공 하 는 인 터 페 이 스 를 구성 합 니 다.https://api.mch.weixin.qq.com/pay/unifiedorder 데 이 터 를 보 내 고 정 보 를 되 돌려 받 으 며 prepay 획득id 선불 주문 번호
>주문 생 성 요청

private String genProductArgs() { 
 StringBuffer xml = new StringBuffer(); 
 
 try { 
 String nonceStr = genNonceStr(); 
 
 xml.append("</xml>"); 
 List<NameValuePair> packageParams = new LinkedList<NameValuePair>(); 
 packageParams 
  .add(new BasicNameValuePair("appid", Constants.APP_ID)); 
 packageParams.add(new BasicNameValuePair("body", "weixin")); 
 packageParams 
  .add(new BasicNameValuePair("mch_id", Constants.MCH_ID)); 
 packageParams.add(new BasicNameValuePair("nonce_str", nonceStr)); 
 packageParams.add(new BasicNameValuePair("notify_url", 
  "http://121.40.35.3/test")); 
 packageParams.add(new BasicNameValuePair("out_trade_no", 
  genOutTradNo())); 
 packageParams.add(new BasicNameValuePair("spbill_create_ip", 
  "127.0.0.1")); 
 packageParams.add(new BasicNameValuePair("total_fee", "1")); 
 packageParams.add(new BasicNameValuePair("trade_type", "APP")); 
 
 String sign = genPackageSign(packageParams); 
 packageParams.add(new BasicNameValuePair("sign", sign)); 
 
 String xmlstring = toXml(packageParams); 
 
 return xmlstring; 
 
 } catch (Exception e) { 
 Log.e(TAG, "genProductArgs fail, ex = " + e.getMessage()); 
 return null; 
 } 
 
 } 
>선불 주문 번호 획득

String url = String.format("https://api.mch.weixin.qq.com/pay/unifiedorder"); 
 String entity = genProductArgs(); 
 
 Log.e("orion", entity); 
 
 byte[] buf = Util.httpPost(url, entity); 
 
 String content = new String(buf); 
 Log.e("orion", content); 
 Map<String, String> xml = decodeXml(content); 
두 번 째 단계:위 챗 결제 매개 변수 생 성
appId 는 APP 앱 에 대응 하 는 APPID,partnerId 는 업 체 번호,prepayId 는 첫 번 째 단계 에서 받 은 선불 주문,packageValue 수치 찾기 Sign=WXPay,nonceStr 는 난수,timestamp 생 성 된 시간 스탬프,sign 은 APP 서명 에 대응 합 니 다.
지불 매개 변수 설정

private void genPayReq() { 
 
 req.appId = Constants.APP_ID; 
 req.partnerId = Constants.MCH_ID; 
 req.prepayId = resultunifiedorder.get("prepay_id"); 
 req.packageValue = "Sign=WXPay"; 
 req.nonceStr = genNonceStr(); 
 req.timeStamp = String.valueOf(genTimeStamp()); 
 
 List<NameValuePair> signParams = new LinkedList<NameValuePair>(); 
 signParams.add(new BasicNameValuePair("appid", req.appId)); 
 signParams.add(new BasicNameValuePair("noncestr", req.nonceStr)); 
 signParams.add(new BasicNameValuePair("package", req.packageValue)); 
 signParams.add(new BasicNameValuePair("partnerid", req.partnerId)); 
 signParams.add(new BasicNameValuePair("prepayid", req.prepayId)); 
 signParams.add(new BasicNameValuePair("timestamp", req.timeStamp)); 
 
 req.sign = genAppSign(signParams); 
 
 sb.append("sign
" + req.sign + "

"); show.setText(sb.toString()); Log.e("orion", signParams.toString()); }
 》nonceStr 난수

private String genNonceStr() { 
 Random random = new Random(); 
 return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)) 
 .getBytes()); 
 } 
타임 스탬프 타임 스탬프

private long genTimeStamp() { 
 return System.currentTimeMillis() / 1000; 
 } 
앱 서명

private String genAppSign(List<NameValuePair> params) { 
 StringBuilder sb = new StringBuilder(); 
 
 for (int i = 0; i < params.size(); i++) { 
 sb.append(params.get(i).getName()); 
 sb.append('='); 
 sb.append(params.get(i).getValue()); 
 sb.append('&'); 
 } 
 sb.append("key="); 
 sb.append(Constants.API_KEY); 
 
 this.sb.append("sign str
" + sb.toString() + "

"); String appSign = MD5.getMessageDigest(sb.toString().getBytes()) .toUpperCase(); Log.e("orion", appSign); return appSign; }
STEP 3:위 챗 앱 결제
지불 하기 전에 핸드폰 에 위 챗 클 라 이언 트 를 설치 해 야 합 니 다.없 으 면 위 챗 을 다운로드 한 다음 에 지불 을 조정 하 라 고 알려 줍 니 다.AndroidManifest.xml 파일 에 다음 설정 을 추가 합 니 다.

<activity 
 android:name=".act.PayActivity" 
 android:exported="true" 
 android:launchMode="singleTop" > 
 <intent-filter> 
 <action android:name="android.intent.action.VIEW" /> 
 
 <category android:name="android.intent.category.DEFAULT" /> 
 
 <data android:scheme="wxf2f565574a968187" /> 
 </intent-filter> 
 </activity> 
>위 챗 으로 지급

private void sendPayReq() { 
 
 msgApi.registerApp(Constants.APP_ID); 
 msgApi.sendReq(req); 
 } 
위 챗 수신 결과
IWXAPIEventHandler 인 터 페 이 스 를 구현 한 Activity 에서 onResp(BaseResp)방법 을 재 작성 하여 위 챗 결 과 를 수신 합 니 다.
>결제 결과 접수

public void onResp(BaseResp resp) { 
 Log.d(TAG, "onPayFinish, errCode = " + resp.errCode); 
 
 if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) { 
 AlertDialog.Builder builder = new AlertDialog.Builder(this); 
 builder.setTitle(R.string.app_tip); 
 builder.setMessage(getString(R.string.pay_result_callback_msg, 
  resp.errStr + ";code=" + String.valueOf(resp.errCode))); 
 builder.show(); 
 } 
 } 
본 고 는,까지 정리 되 었 으 니 여러분 의 읽 기 학습 을 환영 합 니 다.
이상 은 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기